一、
某房地产公司欲开发一套房产信息管理系统,根据如下描述选择合适的设计模式进行设计:
(1) 该公司有多种房型,如公寓、别墅等,在将来可能会增加新的房型;
(2) 销售人员每售出一套房子,主管将收到相应的销售消息。
参考解答:【个人观点】
对于描述(1)可以选择使用工厂方法模式,对于描述(2)可以选择使用观察者模式,本题参考类图如下所示:

在类图中,HouseCreator是抽象房屋工厂类,其子类VilladomCreator用于创建别墅Villadom,子类ApartmentCreator用于创建公寓Apartment,Villadom和Apartment都是抽象房屋类House的子类,此时应用了工厂方法模式,如果增加新类型的房屋,只需对应增加新的房屋工厂类即可,原有代码无须做任何修改;House类同时作为抽象观察目标,子类Villadom和Apartment作为具体观察目标,相关人员类Stakeholder作为抽象观察者,其子类Manager(主管)作为具体观察者,实现了在Stakeholder中声明的response()方法,当房屋售出时,房屋的状态status将发生变化,在setStatus()方法中调用观察者的response()方法,即主管将收到相应消息,此时应用了观察者模式。
二、
猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
要求:
(1) 要有联动性,老鼠和主人的行为是被动的;
(2) 考虑可扩展性,猫的叫声可能引起其他联动效应。
参考解答:【个人观点】
本题可使用观察者模式,参考类图如下所示:

参考代码如下:
import java.util.*;
interface Subject //抽象主题
{
public void addObserver(Observer obs);
public void cry();
}
interface Observer //抽象观察者
{
public void response();
}
class Cat implements Subject //具体主题
{
private ArrayList<Observer> list;
public Cat()
{
list = new ArrayList<Observer>();
}
public void addObserver(Observer obs)
{
list.add(obs);
}
public void cry()
{
System.out.println("猫大叫一声!");
for(Object obj : list)
{
((Observer)obj).response();
}
}
}
class Mouse implements Observer //具体观察者
{
private String name;
public Mouse(String name, Subject subject)
{
this.name = name;
subject.addObserver(this);
}
public void response()
{
System.out.println(this.name + "拼命逃跑!");
}
}
class Master implements Observer //具体观察者
{
private String name;
public Master(String name, Subject subject)
{
this.name = name;
subject.addObserver(this);
}
public void response()
{
System.out.println(this.name + "从美梦中惊醒!");
}
}
class Client //客户端测试类
{
public static void main(String args[])
{
Subject cat = new Cat();
Observer mouse1,mouse2,master;
mouse1 = new Mouse("大老鼠",cat);
mouse2 = new Mouse("小老鼠",cat);
master = new Master("小龙女",cat);
cat.cry();
}
}
//输出结果如下:
//猫大叫一声!
//大老鼠拼命逃跑!
//小老鼠拼命逃跑!
//小龙女从美梦中惊醒!
三、
Windows Media Player和RealPlayer是两种常用的媒体播放器,它们的API结构和调用方法存在区别。现在你的应用程序需要支持这两种播放器API,而且在将来可能还需要支持新的媒体播放器,请问如何设计该应用程序?
参考解答:【个人观点】
本题可使用适配器模式和抽象工厂模式,参考类图如下所示:

在该类图中,我们为两种不同的播放器提供了两个具体工厂类MediaPlayerFactory和RealPlayerFactory,其中MediaPlayerFactory作为Windows Media Player播放器工厂,可以创建Windows Media Player的主窗口(MediaPlayerWindow)和播放列表(MediaPlayerList)(为了简化类图,只列出主窗口和播放列表这两个播放器组成元素,实际情况下包含更多组成元素);RealPlayerFactory作为RealPlayer播放器工厂,创建RealPlayer的主窗口(RealPlayerWindow)和播放列表(RealPlayerList),此时可以使用抽象工厂模式,客户端针对抽象工厂PlayerFactory编程,如果增加新的播放器,只需增加一个新的具体工厂来生产新产品族中的产品即可。由于需要调用现有API中的方法,因此还需要使用适配器模式,在具体产品类如MediaPlayerWindow和MediaPlayerList调用Windows Media Player API中的方法,在RealPlayerWindow和RealPlayerList中调用RealPlayer API中的方法,实现对API中方法的适配,此时具体产品如MediaPlayerWindow、RealPlayerWindow等充当适配器,而已有的API如MediaPlayerAPI和RealPlayerAPI是需要适配的适配者。
本文通过分析房地产公司的房产信息管理系统需求,探讨了如何运用设计模式进行系统设计。针对房型多样化,采用工厂方法模式,易于扩展新类型;为实现销售消息通知,采用观察者模式,确保主管能及时收到销售消息。此外,针对不同媒体播放器的API差异,结合适配器模式和抽象工厂模式,实现应用程序对不同播放器的支持,并易于未来扩展。
10万+





