[设计模式] 观察者模式
参考书籍
《Head First 设计模式》2 观察者(Observer)模式 —— 让你的对象知悉现况[本文主要是基于这本的笔记]
《设计模式:可复用面向对象软件的基础》5.7 OBSERVER(观察者) —— 对象行为型模式
观察者模式是JDK中使用最多的模式之一.
(手机中的后台通知. 天气通知. 新闻订阅. RSS订阅. 报纸和杂志的订阅.)
出版者(Subject)+订阅者(Observer)=观察者模式
定义: 观察者模式定义了对象之间的一对多依赖关系, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新.
Java内置的观察者模式
java.util.Observer <
java.util.Observable <
相关描述查看API文档
在JavaBeans和Swing中, 也都实现了观察者模式.
PropertyChangeListener接口
ActionListener
MVC
要点
- 观察者模式定义了对象之间一对多的关系
- 主题(也就是可观察者)用一个共同的接口来更新观察者
- 观察者和可观察者之间用松耦合方式结合(loosecoupling), 可观察者不知道观察者的细节, 只知道观察者实现了观察者接口
- 使用此模式时, 你可从被观察者处推(push)或拉(pull)数据(然而, 推的方式被认为更"正确")
- 有多个观察者时, 不可以依赖特定的通知次序
- Java有多种观察者模式的实现, 包括了通用的java.util.Observable
- 要注意java.util.Observable实现上所带来的一些问题
- 如果有必要的话, 可以实现自己的Observable
- Swing大量使用观察者模式, 许多GUI框架也是如此
- 此模式也被应用在许多地方, 例如: JavaBeans、RMI
JDK
Observer (or Publish/Subscribe) (recognizeable by behavioral methods which invokes a method on an instance of another abstract/interface type, depending on own state)
- java.util.Observer / java.util.Observable (rarely used in real world though)
- All implementations of java.util.EventListener (practically all over Swing thus)
- javax.servlet.http.HttpSessionBindingListener
- javax.servlet.http.HttpSessionAttributeListener
- javax.faces.event.PhaseListener