观察者模式

原创 2016年08月30日 17:36:55

观察者模式( Observer Pattern) 也叫做发布订阅模式(Publish/subscribe,它是一个在项目中经常使用的模式, 其定义如下:
Define a one-to-many dependency between objects so that when one object changes state,all its
dependents are notified and updated automatically.
( 定义对象间一种一对多的依赖关系, 使得每
当一个对象改变状态, 则所有依赖于它的对象都会得到通知并被自动更新。 )


public class HanFeiZi implements Observable ,IHanFeiZi{
//定义个变长数组, 存放所有的观察者
private ArrayList<Observer> observerList = new ArrayList<Observer>();
//增加观察者
public void addObserver(Observer observer){
this.observerList.add(observer);
}/
/删除观察者
public void deleteObserver(Observer observer){
this.observerList.remove(observer);
}/
/通知所有的观察者
public void notifyObservers(String context){
for(Observer observer:observerList){
observer.update(context);
}
}/
/韩非子要吃饭了
public void haveBreakfast(){
System.out.println("韩非子:开始吃饭了...");
//通知所有的观察者
this.notifyObservers("韩非子在吃饭");
}/
/韩非子开始娱乐了
public void haveFun(){
System.out.println("韩非子:开始娱乐了...");this.notifyObservers("韩非子在娱乐");
}
}

jdk 已经为我们准备了相关的类, java.util.Observer类 和 java.util.Observable类

相关的类图



22.3.1 观察者模式的优点
观察者和被观察者之间是抽象耦合
如此设计, 则不管是增加观察者还是被观察者都非常容易扩展, 而且在
Java中都已经实
现的抽象层级的定义, 在系统扩展方面更是得心应手。
建立一套触发机制
根据单一职责原则, 每个类的职责是单一的, 那么怎么把各个单一的职责串联成真实世
界的复杂的逻辑关系呢? 比如, 我们去打猎, 打死了一只母鹿, 母鹿有三个幼崽, 因失去了
母鹿而饿死, 尸体又被两只秃鹰争抢, 因分配不均, 秃鹰开始斗殴, 然后羸弱的秃鹰死掉,
生存下来的秃鹰, 则因此扩大了地盘
……这就是一个触发机制, 形成了一个触发链。 观察者
模式可以完美地实现这里的链条形式。
22.3.2 观察者模式的缺点
观察者模式需要考虑一下开发效率和运行效率问题, 一个被观察者, 多个观察者, 开发
和调试就会比较复杂, 而且在
Java中消息的通知默认是顺序执行, 一个观察者卡壳, 会影响
整体的执行效率。 在这种情况下, 一般考虑采用异步的方式。
多级触发时的效率更是让人担忧, 大家在设计时注意考虑。
22.3.3 观察者模式的使用场景
关联行为场景。 需要注意的是, 关联行为是可拆分的, 而不是组合关系。
事件多级触发场景。
跨系统的消息交换场景, 如消息队列的处理机制。
22.3.4 观察者模式的注意事项
使用观察者模式也有以下两个重点问题要解决。
广播链的问题
如果你做过数据库的触发器, 你就应该知道有一个触发器链的问题, 比如表
A上写了一
个触发器, 内容是一个字段更新后更新表
B的一条数据, 而表B上也有个触发器, 要更新表
C, 表C也有触发器……完蛋了, 这个数据库基本上就毁掉了! 我们的观察者模式也是一样
的问题, 一个观察者可以有双重身份, 既是观察者, 也是被观察者, 这没什么问题呀, 但是
链一旦建立, 这个逻辑就比较复杂, 可维护性非常差, 根据经验建议, 在一个观察者模式中
最多出现一个对象既是观察者也是被观察者, 也就是说消息最多转发一次( 传递两次) , 这
还是比较好控制的。
注意 它和责任链模式的最大区别就是观察者广播链在传播的过程中消息是随时更改
的, 它是由相邻的两个节点协商的消息结构; 而责任链模式在消息传递过程中基本上保持消
息不可变, 如果要改变, 也只是在原有的消息上进行修正。
异步处理问题
这个
EJB是一个非常好的例子, 被观察者发生动作了, 观察者要做出回应, 如果观察者
比较多, 而且处理时间比较长怎么办? 那就用异步呗, 异步处理就要考虑线程安全和队列的
问题, 这个大家有时间看看
Message Queue, 就会有更深的了解。



版权声明:本文为博主原创文章,未经博主允许不得转载。

浅谈为什么设计模式要有观察者模式--观察者模式的意义

设计模式可以说是一种代码规范,也可以说是一种前人总结的奇技淫巧,对于后来编程者,学习设计模式可以对编程思路有一些启发,其中也包括经验启发. php相对java形式比较随意,所以对于模式设计更需要多花时...
  • h330531987
  • h330531987
  • 2017年09月03日 14:23
  • 377

一个用观察者模式解决实际问题的例子

前几天组里接到一个以前开发的已上线项目的维护任务,要求把其中的一些数据定时通过webservice接口上传到当地某市某平台上面,基本上算是个体力活儿了。 时间仓促只好加班加点,搜集比对 -->拼写S...
  • u012763117
  • u012763117
  • 2014年03月09日 02:31
  • 1482

观察者模式(看完马士兵视频的总结)

例子就是一个小孩在睡觉,当小孩醒过来之后,爸爸要喂奶,爷爷要
  • oWuGuanFengYue123
  • oWuGuanFengYue123
  • 2014年05月06日 11:45
  • 1615

JavaScript设计模式--观察者模式

一、定义观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式...
  • ligang2585116
  • ligang2585116
  • 2015年12月20日 19:22
  • 5085

Unity设计模式:观察者模式

初学编程的时候内容比较少没有数据交互,等内容多到需要多个文件多个类协同运行的时候就涉及到类之间的数据交互了。比较简单的数据交互是这些类之间互相引用,直接或间接传值或调用,但是这样类之间的耦合性太高了,...
  • ylbs110
  • ylbs110
  • 2016年12月31日 08:36
  • 532

观察者模式(这个用的太多了)

一.观察者模式的定义 定义对象间一种一对多的依赖关系,是的没当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。 二.观察者模式的使用场景 (1).关联行为场景,需要注意的是,关联行...
  • u011889786
  • u011889786
  • 2016年04月04日 10:21
  • 883

线程安全的观察者模式的设计

观察者模式的应用,主要的行为就是注册和移除观察者(observer),以及通知所有已注册的Observers。这里介绍的是Chromium项目中实现的线程安全的观察者管理及通知的基础类Observer...
  • HorkyChen
  • HorkyChen
  • 2015年08月05日 01:12
  • 2912

设计模式实战应用之二:观察者模式

观察者模式的定义         观察者模式是应用最普遍的设计模式之一。著名的 MVC 模式就是观察者模式的应用之一。Gof 把观察者模式归类到对象行为型模式,《设计模式:可复用面向对象软件的基础》对...
  • defonds
  • defonds
  • 2013年12月04日 18:42
  • 5891

JAVA中观察者模式示例

观察者模式是关于多个对象想知道一个对象中数据变化情况的一种成熟模式。观察者模式中有一个称作“主题”的对象和若干个称作“观察者”的对象,“主题”和“观察者”之间是一种一对多的依赖关系 。当“主题”...
  • qq7342272
  • qq7342272
  • 2011年10月26日 15:36
  • 6915

观察者模式的优缺点以及使用场景(三)

观察者模式的效果有以下的优点:第一、观察者模式在被观察者和观察者之间建立一个抽象的耦合。观察者模式有下面的缺点:第一、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很...
  • MNJLJ_23NMK
  • MNJLJ_23NMK
  • 2016年04月21日 12:08
  • 4267
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:观察者模式
举报原因:
原因补充:

(最多只允许输入30个字)