问题 问答题

阅读下列说明和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)。

选择题
单项选择题 配伍题