设计模式之观察者模式
2016-03-28 20:11
155 查看
观察者模式也叫发布订阅模式,其定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
通用UML类图:
![](http://img.blog.csdn.net/20160328185842377?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
- Subject被观察者,定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。
- Observer观察者,观察者接收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理。
- ConcreateSubject具体的被观察者,定义被观察者自己的业务逻辑,同时定义对哪些时间进行通知。
- ConcreateObserver具体的观察者,每个观察在接收到消息后的处理是不同的,各个观察者有自己的处理逻辑
通用代码:
使用场景:
- 关联行为场景。需要注意的是,关联行为是可拆分的,而不是组合关系。
- 事件多级触发场景。
- 跨系统的消息交换场景,如消息队列的处理机制。
注意事项:
其实java已经为我们提供了oberverable和oberver这个观察者框架,所以平常如果要用观察者模式的话,直接继承和实现就可以了,不用自己再重复写。
观察者模式在实际项目中的应用:
- 观察者和被观察者之间的消息沟通,一般情况下,观察中中的update方法接收两个参数,一个是被观察者,一个是DTO(传输对象),DTO一般是一个纯洁的javaBean,由被观察者生成,观察者消费。如果考虑到远程传输,一般消息是以XML格式传递。
- 观察者的响应方式,要使观察者能快速响应,有两个方法:一是采用多线程技术,即异步架构;而是缓存技术,即我缓存了几乎所有的可能性结果,你来请求就能马上从缓存中返回给你,这个即是同步架构。
- 被观察者尽量自己做主,意思是当被观察者状态变更时,不一定一定要通知所有的观察者,可以判断一下是否有必要通知。
通用UML类图:
- Subject被观察者,定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。
- Observer观察者,观察者接收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理。
- ConcreateSubject具体的被观察者,定义被观察者自己的业务逻辑,同时定义对哪些时间进行通知。
- ConcreateObserver具体的观察者,每个观察在接收到消息后的处理是不同的,各个观察者有自己的处理逻辑
通用代码:
public class Subject { private Vector<Observer> list = new Vector<Observer>(); public void addObserver(Observer o){ this.list.add(o); } public void removeObserver(Observer o){ this.list.remove(o); } public void notifyObservers(){ for(Observer o : this.list){ o.update(); } } }
public class ConcreateSubject extends Subject{ public void doSomething(){ //具体的业务操作 super.notifyObservers(); } }
public interface Observer { public void update(); }
public class ConcreateObserver implements Observer{ @Override public void update() { //实行更新方法 } }
public class Client { public static void main(String[] args) { //创建一个被观察者 ConcreateSubject subject = new ConcreateSubject(); //定义一个观察者 Observer observer = new ConcreateObserver(); //注册观察者 subject.addObserver(observer); //被观察者开始活动 subject.doSomething(); } }
使用场景:
- 关联行为场景。需要注意的是,关联行为是可拆分的,而不是组合关系。
- 事件多级触发场景。
- 跨系统的消息交换场景,如消息队列的处理机制。
注意事项:
其实java已经为我们提供了oberverable和oberver这个观察者框架,所以平常如果要用观察者模式的话,直接继承和实现就可以了,不用自己再重复写。
观察者模式在实际项目中的应用:
- 观察者和被观察者之间的消息沟通,一般情况下,观察中中的update方法接收两个参数,一个是被观察者,一个是DTO(传输对象),DTO一般是一个纯洁的javaBean,由被观察者生成,观察者消费。如果考虑到远程传输,一般消息是以XML格式传递。
- 观察者的响应方式,要使观察者能快速响应,有两个方法:一是采用多线程技术,即异步架构;而是缓存技术,即我缓存了几乎所有的可能性结果,你来请求就能马上从缓存中返回给你,这个即是同步架构。
- 被观察者尽量自己做主,意思是当被观察者状态变更时,不一定一定要通知所有的观察者,可以判断一下是否有必要通知。
相关文章推荐
- 项目14-三角形类雏形(2)
- C#的Socket编程基础
- 《Linux内核设计与实现》第十八章读书笔记
- 月光微博客
- leetcode 113. Path Sum II
- HK共享吧解压密码
- 云通信-腾讯云,TLS独立模式公私钥生成
- HK共享吧解压密码
- selenium在远程服务器上的虚拟显示
- Android SwipeRefreshLayout 下拉刷新组件的使用
- 设计模式--单例模式
- React-Native 之Android应用开发踩坑纪 (一)————windows环境下配置
- 缺失值处理方法
- 滴滴出行iOS客户端架构演进之路
- 时间类2
- 实现ViewPager懒加载的三种方法
- Leetcode 112. Path Sum
- POJ 2752 Seek the Name, Seek the Fame(next数组的应用)
- 第五周项目3时间类(1)
- 架构师必看 京东咚咚架构演进