observer


定义

名称:Observer

结构:



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

适用性:
  • 当一个抽象模型有两个方面,其中一个依赖于另一个,将这二者封装在独立的对象中使它们可以各自独立地改变和复用
  • 当对一个对象的改变需要同时改变其它对象,但不知道具体有多少对象有待改变
  • 当一个对象必须通知其它对象,但它又不能假定其它对象是什么,亦即不希望这些对象是紧密耦合的

    效果:
    允许你独立的改变目标和观察者。你可以单独复用目标对象而无需同时复用其观察者,反之亦然。你也可以在不改动目标和其它观察者的前提下增加观察者



经典案例

1、AWT/Swing DEM (Delegation Event Model)
        AWT1.0的事件处理的模型是基于责任链的。这种模型不适用于复杂的系统,因此在AWT1.1版本及以后的各个版本中,事件处理模型均为基于观察者模式的委派事件模型(Delegation Event Model或DEM)。
  在DEM模型里面,主题(Subject)角色负责发布(publish)事件,而观察者角色向特定的主题订阅(subscribe)它所感兴趣的事件。当一个具体主题产生一个事件时,它就会通知所有感兴趣的订阅者。
  使用这种发布-订阅机制的基本设计目标,是提供一种将发布者与订阅者松散地耦合在一起的联系形式,以及一种能够动态地登记、取消向一个发布者的订阅请求的办法。显然,实现这一构思的技巧,是设计抽象接口,并把抽象层和具体层分开。这在观察者模式里可以清楚地看到。
  使用DEM的用词,发布者叫做事件源(event source),而订阅者叫做事件聆听者(event listener)。在Java里面,事件由类代表,事件的发布是通过同步地调用成员方法做到的。
   Servlet技术中的的DEM机制
  AWT中所使用的DEM事件模型实际上被应用到了所有的Java事件机制上。Servlet技术中的事件处理机制同样也是使用的DEM模型。
   SAX2技术中的DEM机制
  DEM事件模型也被应用到了SAX2的事件处理机制上。

最佳实践

1、J2SE中的Observer接口和Observable类
        Observer和Observable分别对应设计模式中的Observer和Subject
        java.util.Observer: 
  • update(Observable subject, Object arg) 监控subject,当subject对象状态发生变化时Observer会有什么响应,arg是传递给Observable的notifyObservers方法的参数;
        java.util.Observable: 
  • addObserver(Observer observer) observer向该subject注册自己 
  • hasChanged() 检查该subject状态是否发生变化 
  • setChanged() 设置该subject的状态为“已变化” 
  • notifyObservers() 通知observer该subject状态发生变化


2、 观察者模式的效果有以下的优点:
  第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体观察者列表,每一个具体观察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。
  由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。如果被观察者和观察者都被扔到一起,那么这个对象必然跨越抽象化和具体化层次。
  第二、观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知,

  观察者模式有下面的缺点:
  第一、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  第二、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点。
  第三、如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
  第四、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。


相关模式
1、观察者模式使用了备忘录模式(Memento Pattern)暂时将观察者对象存储在被观察者对象里面。


参考文章
1、面向对象图形用户界面(GUI)和Java AWT
      http://www.contextfree.net/wangyw/oo_class/gui.html
2、Java Q&A: 使用Observer模式
3、爪哇语言观察者模式介绍
      http://www.yesky.com/20020603/1614140_3.shtml
3、Observer模式深度探索
      在.NET技术框架下深入发掘了Observer模式的内涵
      http://www.uml.org.cn/sjms/200461335.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值