阅读下列说明和C++代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】某实验室欲建立一个实验室环境监测系统,能够显示实验室的温度、湿度以及洁净度等环境数据。当获取到最新的环境测量数据时,显示的环境数据能够更新。现在采用观察者(Observer)模式来开发该系统。观察者模式的类图如图5-1所示。
C++代码如下:
参考答案:
(1)Subject
(2)(*it)->update(temperature,humidity,cleanness)
(3)notifyObservers()
(4)measurementsChanged()
(5)Observer
(6)envData->registerObserver(this)
解析:
本题考察观察者(Observer)模式的概念及应用。
观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
Observer模式适用于:
①当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这两者封装在独立地对象中以使它们可以各自独立地改变和复用。
②当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变时。
③当一个对象必须通知其他对象,而它又不能假定其他对象是谁,即:不希望这些对象是紧耦合的。
观察者模式的结构如下图所示,其中:
Subject(主题)知道它的观察者,可以有任意多个观察者观察同一个目标;提供注册和删除观察者对象的接口。
Observer(观察者)为那些在目标发生改变时需获得通知的对象定义一个更新接口。
ConcreteSubject(具体主题)将有关状态存入一个ConcreteObserver对象;当它的状态发生改变时,向它的各个观察者发出通知。ConcreteObserver(具体观察者)维护一个指向ConcreteSubject对象的引用;存储有关状态,这些状态应与主题的状态保持一致;实现Observer的更新接口以使自身状态与主题的状态保持一致。
在本题的说明中,给出了观察者模式的结构图,答题时需要首先确定程序中的类与观察者模式结构的对应关系,也就是要找到哪些是ConcreteSubject,哪些是ConcreteObserver。由程序上下文可以判断出,类EnvironmentData对应的是ConcreteSubject,类CurrentConditionsDisplay对应的是ConcreteObserver。根据类图,它们分别为Subject和Observer的子类。由此可以,空(1)和空(5)应分别填写Subject和Observer。
空(2)要求给出方法notifyObservers的实现,其功能是在主题发生变化时通知观察者。通知的实现是通过向对该主题感兴趣的所有观察者发送update消息实现的。对主题EnvironmentData感兴趣的观察者由向量observers表示,所以在notifyObservers方法中,就是对向量observers中的每个成员发送update消息,因此空(2)应填写(*it)->update(temperature,humidity,cleanness)。
方法measurementsChanged表示主题发生了变化,这时应该通知对应的观察者,所以空(3)处应填写notifyObservers()。
方法setMeasurements用于设置发生变化后的主题内容,所以空(4)处应填写measurementsChanged()。
CurrentConditionsDisplay是对主题EnvironmentData感兴趣的一个观察者,要能够获得主题的变化,需要首先将自己注册为该主题的观察者,这个注册行为在其构造函数中完成。因此空(6)处应填写envData->registerObserver(this)。