设计模式之观察者(Observer)模式
2016-04-13 12:48
483 查看
别名
发布-订阅(Publish-Subscribe)模式、从属者(Dependents)模式
定义
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
定义一组对象间的一对多依赖,使得当一个对象的状态改变时,它的所有依赖能得到通知并自动更新。
结构
组成
主题
知道它的观察者
允许任意多个观察者观察这个主题
提供附加和分离观察者的接口
观察者
定义一个当主题发生变化时被通知的更新接口
具体主题
保存对此主题感兴趣的观察者的状态
当自身状态改变时通知观察者
具体观察者
保持对主题的引用
保存应当和主题保持一致的状态
实现观察者的更新接口使自己的状态能和主题保持一致
代码
主题
仓库
https://github.com/luoxin1992/DesignPatterns/tree/master/src/prj/designpatterns/observer
后记
JDK通过java.util.Observer和java.util.Observable内置了对观察者模式的支持
该模式既支持Observable向Observer推(Push)数据,也支持Observer从Observable拉(Pull)数据
但注意Observable是逆序通知Observer,而且Observable是一个类!【好像是第一次见-able结尾的类……】
另,观察者模式和回调机制十分相似,可以把回调机制看作观察者模式的特例(只有一个观察者)
发布-订阅(Publish-Subscribe)模式、从属者(Dependents)模式
定义
Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.
定义一组对象间的一对多依赖,使得当一个对象的状态改变时,它的所有依赖能得到通知并自动更新。
结构
组成
主题
知道它的观察者
允许任意多个观察者观察这个主题
提供附加和分离观察者的接口
观察者
定义一个当主题发生变化时被通知的更新接口
具体主题
保存对此主题感兴趣的观察者的状态
当自身状态改变时通知观察者
具体观察者
保持对主题的引用
保存应当和主题保持一致的状态
实现观察者的更新接口使自己的状态能和主题保持一致
代码
主题
package prj.designpatterns.observer.prototype; /** * 主题 * * @author LuoXin * */ public interface ISubject { public void addObserver(IObserver o); public void deleteObserver(IObserver o); public void notifyObserver(); }观察者
package prj.designpatterns.observer.prototype; /** * 观察者 * * @author LuoXin * */ public interface IObserver { public void update(); }具体主题
package prj.designpatterns.observer.prototype; import java.util.ArrayList; import java.util.List; /** * 具体主题 * * @author LuoXin * */ public class ConcreteSubject implements ISubject { private List<IObserver> observers; public ConcreteSubject() { this.observers = new ArrayList<IObserver>(); } @Override public void addObserver(IObserver o) { observers.add(o); System.out.println("添加了观察者" + o.hashCode()); } @Override public void deleteObserver(IObserver o) { observers.remove(o); System.out.println("删除了观察者" + o.hashCode()); } @Override public void notifyObserver() { for (IObserver o : observers) { o.update(); System.out.println("通知了观察者" + o.hashCode()); } } }具体观察者
package prj.designpatterns.observer.prototype; /** * 具体观察者 * * @author LuoXin * */ public class ConcreteObserver implements IObserver { @Override public void update() { System.out.println("观察者" + this.hashCode() + "收到了通知"); } }客户端
package prj.designpatterns.observer.prototype; /** * 客户端 * * @author LuoXin * */ public class Client { public static void main(String[] args) { ISubject subject = new ConcreteSubject(); IObserver observer1 = new ConcreteObserver(); IObserver observer2 = new ConcreteObserver(); subject.addObserver(observer1); subject.addObserver(observer2); subject.notifyObserver(); subject.deleteObserver(observer2); subject.notifyObserver(); } }
仓库
https://github.com/luoxin1992/DesignPatterns/tree/master/src/prj/designpatterns/observer
后记
JDK通过java.util.Observer和java.util.Observable内置了对观察者模式的支持
该模式既支持Observable向Observer推(Push)数据,也支持Observer从Observable拉(Pull)数据
但注意Observable是逆序通知Observer,而且Observable是一个类!【好像是第一次见-able结尾的类……】
另,观察者模式和回调机制十分相似,可以把回调机制看作观察者模式的特例(只有一个观察者)
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- C#中观察者模式的3种实现方式
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用