设计模式——观察者模式

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



Subject:被观察者,被观察者知道它的观察者,可以有任意多个观察者观察同一个目标,提供注册和删除观察者对象的接口;
Observer:观察者,为那些在目标发生改变时需获得通知的对象定义一个更新接口;
ConcreteSubject:具体目标,将有关状态存入各个ConcreteObserver对象,当它的状态发生改变时,向它的各个观察者发出通知;
ConcreteObserver:具体观察者,保存一个指向ConcreteSubject对象的引用,存储有关状态,与Subject状态一致,实现Observer的更新接口,使自身状态与Subject状态一致;

优点:
(1)目标与观察者间抽象耦合;
(2)支持广播通讯;
(3)建立一套触发机制,可以通过观察者模式实现一条触发链

缺点:
(1)由于观察者不知道其他观察者的存在,可能会引起意外的更新;
(2)多级触发效率低下

实现:
(1)当观察者过多时,可以使用一个hash表来维护目标与观察者的远射;
(2)一个观察者可以观察多个目标;
(3)当删除目标Subject时,应该通知它的观察者Observer对该目标的引用进行重置,避免出现野指针;
(4)当Subject发出通知前,要先更新自己的状态,确保自身状态与新状态一致;
(5)更新数据时,可以使用推模型,或拉模型,推模型是目标Subject把所有的更新数据传给观察者Observer,拉模型是 Subject只通知 Observer数据已更新,然后有 Observer主动请求需要的数据;
(6)可以扩展目标的注册接口,让观察者注册时指定感兴趣的事件,只有当该事件发生时,才通知观察者;
(7)对于不支持多重继承的语言,通常将Subject类和Observer类写到一个类中;
(8)当目标与观察者间的依赖关系特别复杂时,需要一个维护这种关系的对象,变更管理器(ChangeManager)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值