Behavioral模式之Observer模式
2015-06-23 14:16
447 查看
1.意图
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。2.别名
依赖(dependents),发布-订阅(Publish-Subscribe)3.动机
将一个系统分割成一系列相互协作的类,有一个常见的副作用:需要维护相关对象间的一致性。我们不希望为了维持一致性而使得个类之间紧密耦合,因此这样降低了他们的可重用性。4.适用性
以下情况使用ObServer模式:- 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这二者封装在独立的对象中以使它们可以各自独立的改变和复用。
- 当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。
- 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之,你不希望这些对象之间是紧密耦合的。
5.结构
包括这个模式在内的接下来的四个模式,都是类和类之间的关系,不涉及到继承,学的时候应该 记得归纳,记得本文最开始的那个图。观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。先来看看关系图:我解释下这些类的作用:MySubject类就是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。我们看实现代码:
6.代码示例
实现代码:一个Observer接口:
[code]public interface Observer { public void update(); }
两个实现类::
[code]public class Observer1 implements Observer { @Override public void update() { System.out.println("observer1 has received!"); } } public class Observer2 implements Observer { @Override public void update() { System.out.println("observer2 has received!"); } }
Subject接口及实现类::
[code]public interface Subject { /*增加观察者*/ public void add(Observer observer); /*删除观察者*/ public void del(Observer observer); /*通知所有的观察者*/ public void notifyObservers(); /*自身的操作*/ public void operation(); } public abstract class AbstractSubject implements Subject { private Vector<Observer> vector = new Vector<Observer>(); @Override public void add(Observer observer) { vector.add(observer); } @Override public void del(Observer observer) { vector.remove(observer); } @Override public void notifyObservers() { Enumeration<Observer> enumo = vector.elements(); while(enumo.hasMoreElements()){ enumo.nextElement().update(); } } } public class MySubject extends AbstractSubject { @Override public void operation() { System.out.println("update self!"); notifyObservers(); } }
测试类:
[code]public class ObserverTest { public static void main(String[] args) { Subject sub = new MySubject(); sub.add(new Observer1()); sub.add(new Observer2()); sub.operation(); } }
输出:
update self!
observer1 has received!
observer2 has received!。
7.相关模式
引用:http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
http://item.jd.com/10057319.html
/article/1354307.html
相关文章推荐
- Javadoc详解(二)
- ALSA声卡驱动中的DAPM详解之七:dapm事件机制(dapm event)
- Flex4+BlazeDS+Spring+Hibernate 整合
- java 免费发送短信实例程序
- 巧克力爱好者匿名顺序图——管理员
- c#实现统计代码执行时间
- android属性动画详解2
- 派生类向基类转换的可访问性
- 【读书笔记:C++ primer plus 第六版 中文版】第8章 函数探幽
- [trouble-shooting]android 无法启动X86模式虚拟机的问题解决。
- 如果在安装32位oracle 客户端组件时的情况下以64位模式运行,将出现问题
- Eclipse的ADT插件提示版本问题的解决办法
- python多线程编程----threading模块
- TCP 连接断连问题剖析
- Android Animation学习笔记
- ALSA声卡驱动中的DAPM详解之六:精髓所在,牵一发而动全身
- 免安装版Tomcat配置用户登录项目管理界面
- 腾讯QQ音乐网页版 音频初始化模块解压混淆js源码
- php常用正则表达式
- 黑马程序员---多线程