观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新

问题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()
  • C1C2C3类继承自SNSObserver,实现GetState()SetState()方法,并重写Update()方法。

问题

  1. 问题1:根据说明中的描述,图3-1中C1、C2、C3所对应的类名。
  2. 问题2:图3-1中采用了哪一种设计模式?说明该模式的意图及其适用场合。
  3. 问题3:实现一个新需求,一个群体可以作为另一个群体中的成员,例如群体A加入群体B,群体A中的所有成员就自动成为群体B中的成员。需要对图3-1进行哪些修改?

这些问题要求分析类图和设计模式,并提出修改建议以满足新的需求。

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会收到通知并自动更新。这种模式通常用于实现事件处理系统、订阅/发布系统等。

观察者模式的应用步骤

  1. 定义主题(Subject)接口

    • 包含管理观察者的方法,如添加、删除观察者,以及通知所有观察者的方法。
  2. 实现具体主题(Concrete Subject)

    • 维护观察者列表,并在状态改变时调用通知方法。
  3. 定义观察者(Observer)接口

    • 包含一个更新接口,用于接收主题的通知。
  4. 实现具体观察者(Concrete Observer)

    • 实现更新接口以定义接收通知时的行为。
  5. 客户端代码

    • 创建具体主题和具体观察者对象,并将观察者注册到主题中。

应用示例

在社交网络平台中,观察者模式可以用于实现群组信息的更新通知系统:

  • SNSSubject 类扮演主题的角色,负责管理观察者(群组成员)。
  • SNSObserver 类定义了观察者接口,包含一个 Update() 方法,用于接收更新通知。
  • SNSUser 类实现观察者接口,当群组信息更新时,接收通知并更新自己的状态。
  • 当群组信息发生变化时,SNSSubject 类调用 Notify() 方法,通知所有注册的观察者(群组成员)。

适用场合

观察者模式适用于以下场合:

  • 当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要改变。
  • 当一个对象必须通知其他对象,而它又不能假定其他对象是谁。
  • 当系统中存在大量分散的对象,这些对象需要在运行时动态交互。

通过使用观察者模式,可以降低对象之间的耦合度,提高系统的灵活性和可扩展性。

观察者模式的优缺点如下:

  • 优点
    • 解耦性好:实现观察者(如社交群组里的成员 )与被观察者(如群组主页 )的解耦,二者仅通过抽象接口交互,依赖松散,一方变化不直接影响另一方,利于系统维护扩展,比如电商里商品库存(被观察者)变化,不影响消费者(观察者)处理逻辑。
    • 灵活性高:允许运行时动态增删观察者,像新闻系统里用户可随时订阅/取消订阅新闻,系统无需大规模改动。
    • 建立触发机制:被观察者状态变,自动通知所有观察者,保证相关对象及时更新,提升系统响应性,如股票系统中股票价格(被观察者)变动,投资者(观察者)能及时收到通知。
    • 支持广播通信:主题(被观察者)变化可通知所有观察者,实现类似广播的效果,适用多对象需同步更新场景,比如MVC模式里模型(被观察者)变化通知视图(观察者)更新 。
  • 缺点
    • 通知耗时:被观察者有大量直接/间接观察者时,通知所有观察者会耗时,大型社交平台热门话题变化通知大量用户,可能致系统性能下降。
    • 循环依赖风险:观察者和被观察者间若循环依赖,可能使系统崩溃,复杂系统中两模块相互观察、循环调用就易出问题。
    • 缺乏变化细节:仅通知观察者对象变化,未告知变化细节,部分需了解变化过程的场景(如数据分析系统)会不便,观察者仅知数据变,不知具体哪些数据及原因。
    • 性能问题(观察者过多时):大量观察者存在,状态变化会多次调用更新方法,影响性能,比如大型系统中众多模块作为观察者,频繁更新易拖慢速度 。
    • 管理复杂(大量观察者注销时):大量观察者需注销时,要确保状态一致性,管理复杂,若处理不好,可能引发错误 。
    • 通知无顺序(可能带来不确定性):通知观察者顺序难控,复杂业务场景下,不同处理顺序可能引发不同结果,导致不确定性 。
    • 在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bol5261

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值