问题1答案
- C1:SNSGroup ;C3:SNSUser(因为SNSGroup作为群组,有设置和获取状态等操作,SNSUser作为成员是观察者 )
问题2答案
- 设计模式:观察者模式(Observer Pattern)。
- 意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新 。
- 适用场合:当一个抽象模型有两个方面,其中一个方面依赖于另一个方面;或者一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变;以及需要在系统中建立一个触发机制,一个对象的状态变化能触发其他对象更新时,可使用观察者模式,这里群组(SNSGroup )状态变化(发布/更新信息)触发成员(观察者)更新(接收信息),符合场景 。
问题3答案
- 需修改:让SNSGroup类也继承SNSObserver类,使其可作为被观察的“成员”;在SNSGroup类中添加处理群体加入群体逻辑,如当群体A加入群体B时,群体B的AddUser方法需能识别并处理群体A,遍历群体A成员并添加到群体B成员列表,同时群体A作为观察者注册到群体B的被观察对象中 ,保证群体A成员能收到群体B信息,群体A自身状态变化也可按观察者模式通知 。
类列表(表3-1)
- SNSSubject:群组主页的描述。
- SNSGroup:社交网络平台中的群组(在主页上发布信息)。
- SNSObserver:群组主页内容的关注者。
- SNSUser:社交网络平台用户/群组成员。
- SNSAdmin:群组的管理员。
类图(图3-1)
类图展示了一个观察者模式的实现:
- SNSSubject类有方法:
AddUser()
、RemoveUser()
、Notify()
。 - SNSObserver类有方法:
Update()
。 - C1、C2、C3类继承自
SNSObserver
,实现GetState()
和SetState()
方法,并重写Update()
方法。
问题
- 问题1:根据说明中的描述,图3-1中C1、C2、C3所对应的类名。
- 问题2:图3-1中采用了哪一种设计模式?说明该模式的意图及其适用场合。
- 问题3:实现一个新需求,一个群体可以作为另一个群体中的成员,例如群体A加入群体B,群体A中的所有成员就自动成为群体B中的成员。需要对图3-1进行哪些修改?
这些问题要求分析类图和设计模式,并提出修改建议以满足新的需求。
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。这种模式通常用于实现事件处理系统、订阅/发布系统等。
观察者模式的应用步骤
-
定义主题(Subject)接口:
- 包含管理观察者的方法,如添加、删除观察者,以及通知所有观察者的方法。
-
实现具体主题(Concrete Subject):
- 维护观察者列表,并在状态改变时调用通知方法。
-
定义观察者(Observer)接口:
- 包含一个更新接口,用于接收主题的通知。
-
实现具体观察者(Concrete Observer):
- 实现更新接口以定义接收通知时的行为。
-
客户端代码:
- 创建具体主题和具体观察者对象,并将观察者注册到主题中。
应用示例
在社交网络平台中,观察者模式可以用于实现群组信息的更新通知系统:
- SNSSubject 类扮演主题的角色,负责管理观察者(群组成员)。
- SNSObserver 类定义了观察者接口,包含一个
Update()
方法,用于接收更新通知。 - SNSUser 类实现观察者接口,当群组信息更新时,接收通知并更新自己的状态。
- 当群组信息发生变化时,
SNSSubject
类调用Notify()
方法,通知所有注册的观察者(群组成员)。
适用场合
观察者模式适用于以下场合:
- 当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要改变。
- 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。
- 当系统中存在大量分散的对象,这些对象需要在运行时动态交互。
通过使用观察者模式,可以降低对象之间的耦合度,提高系统的灵活性和可扩展性。
观察者模式的优缺点如下:
- 优点:
- 解耦性好:实现观察者(如社交群组里的成员 )与被观察者(如群组主页 )的解耦,二者仅通过抽象接口交互,依赖松散,一方变化不直接影响另一方,利于系统维护扩展,比如电商里商品库存(被观察者)变化,不影响消费者(观察者)处理逻辑。
- 灵活性高:允许运行时动态增删观察者,像新闻系统里用户可随时订阅/取消订阅新闻,系统无需大规模改动。
- 建立触发机制:被观察者状态变,自动通知所有观察者,保证相关对象及时更新,提升系统响应性,如股票系统中股票价格(被观察者)变动,投资者(观察者)能及时收到通知。
- 支持广播通信:主题(被观察者)变化可通知所有观察者,实现类似广播的效果,适用多对象需同步更新场景,比如MVC模式里模型(被观察者)变化通知视图(观察者)更新 。
- 缺点:
- 通知耗时:被观察者有大量直接/间接观察者时,通知所有观察者会耗时,大型社交平台热门话题变化通知大量用户,可能致系统性能下降。
- 循环依赖风险:观察者和被观察者间若循环依赖,可能使系统崩溃,复杂系统中两模块相互观察、循环调用就易出问题。
- 缺乏变化细节:仅通知观察者对象变化,未告知变化细节,部分需了解变化过程的场景(如数据分析系统)会不便,观察者仅知数据变,不知具体哪些数据及原因。
- 性能问题(观察者过多时):大量观察者存在,状态变化会多次调用更新方法,影响性能,比如大型系统中众多模块作为观察者,频繁更新易拖慢速度 。
- 管理复杂(大量观察者注销时):大量观察者需注销时,要确保状态一致性,管理复杂,若处理不好,可能引发错误 。
- 通知无顺序(可能带来不确定性):通知观察者顺序难控,复杂业务场景下,不同处理顺序可能引发不同结果,导致不确定性 。