观察者模式
来源:互联网 发布:电瓶车速度测试软件 编辑:程序博客网 时间:2024/05/01 22:08
定义
定义对象间一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
常用结构
Subject : 目标对象,[一般是接口]
Observer:定义观察者的接口
ConcreteSubject : 具体的目标对象
ConcreteObserver : 观察者的具体实现
实现
一般在Subject中维护这一个Observer的List列表,用于更新时调用。
观察者模式中,又分为推模型和拉模型(ps:可能很多人对这两种模型的概念都基于websocket和comet、ajax的前后端交互,笔者也是(~))。在推模型中,Subject的update方法给每一个Observer传递的是消息内容或者简单封装,而在拉模型中,Subject的update方法给每一个Observer传递的是Subject自身,也就是this。
两种模型的比较:
- 推模型是假定目标对象知道观察者需要的数据,而拉模型是目标对象不知道观察者需要的数据。
- 在可扩展性方面,推模型更能很好的使用外部的变化。
java中的观察者模式
public class Sender extends java.util.Observable{ ...... 数据和函数的封装 private String content ; publc String getContent(){ return this.content; } //这里是事件触发 public void setContent(String content){ this.content = content; //下面是必须的 this.setChanged(); //这个是推模型,把content放进去了 this.notifyObservers(this,coent); //这个是拉模型,直接通知 this.notifyObservers(); }} public class Receiver implements java.util.Observer{ ....数据和函数的封装 public void update(Observable o,Object obj){ //推模型处理 System.out.println("推模型 可以获取内容 :"+obj) //拉模型,数据需要自己去拿 System.out.println("推模型 可以获取内容 :"+((Sender)o).getContent()); }}//客户端将观察者和被观察者组合起来public class Client{ public static void main(String[]args) { Receiver r1 = new Receiver(); Receiver r2 = new Receiver(); Receiver r3 = new Receiver(); Sender s1 = new Sender(); s1.addObserver(r1); s1.addObserver(r2); s1.addObserver(r3); s1.setContent("my name is Obervable"); }}
进行相关实践,当一个观察者多个被观察者的情况下,性能问题就需要解决。
常规方法,采用多线程技术和缓存机制(有没有想到B/S架构,由此引伸出的异步和同步机制,这里面的东西后面细讲)。
当一个被观察者多个观察者的时候,也有相关的问题解决,淘宝在进行大规模开发的时候,一个注册事件就需要同时引起多个事件发生,在大规模数据流动的情况下,性能压力和容错机制需要很完善,淘宝内部开发了相应的机制。
小生愚钝,在学习scala的时候,就遇到过actor的通知机制,后来学习了akka,感觉在scala实现观察者更简单,不知道各位大神怎么看~
No Final is final
0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- Step One - 安装JDK和JRE
- hdu1010 Tempter of the Bone(dfs)
- DNS 协议
- Accelerated C++ Exercises Ch10
- C++学习笔记
- 观察者模式
- CodeForces 222A Shooshuns and Sequence
- 例题10-6 无关的元素 UVa1635
- C++备忘-QT(2)
- ui到底是什么?
- 0005 嘿嘿
- pat1017 Queueing at Bank
- POJ 2503 Babelfish (Trie树 或 map)
- 接口的使用和规则