- 浏览: 869851 次
- 性别:
- 来自: 美国图森
最新评论
-
jnjeC:
jake_12345 写道大哥,这写错了吧Class.isAs ...
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别 -
lgh1992314:
https://my.oschina.net/xianggao ...
Servlet生命周期 -
qq412796770:
大哥,百度第一条就是你的,好歹也修改一下吧
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别 -
技术无涯苦作舟:
大哥,百度第一条就是你的,好歹也修改一下吧
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别 -
lgh1992314:
大哥,百度第一条就是你的,好歹也修改一下吧
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
观察者模式在软件编程中用的较多,我不善于表达我就用在网上看到的故事,和生活的例子说下基本思想
故事:
小雪是一个非常漂亮的女孩,漂亮的女孩总是有很多的追求者,而且追求者的队伍在不断的变动,随时有人进入这个队伍,也有人退出。男孩们追求女孩时总是表现出120%的关心,当小雪私自游玩时总是不断收到追求者询问小雪位置变动的消息,小雪也不胜其烦,但小雪是如此的一个善良的女孩,她总是打断自己正常的生活回复男孩们的消息。而男孩们由于要不断的关心小雪的位置变化也弄的精疲力竭,而且还影响正常的工作。在这样一个简单的故事场景中我们发现了什么?来看看小雪和男孩们的烦恼:
1.男孩们必须不断的询问小雪的位置变化,从而打断正常的工作;
2.小雪也要不断的接受男孩们的询问,有的时候小雪的位置并没有发生变化,还是要不断的回复男孩们的询问,也影响正常的工作。
3.如果给各个男孩们回复问题的方式都不尽相同,小雪还要知道不同的回复方式,而且不断的有新的男孩们增加进来,还不知道未来有什么新的回复方式。
看到这么多烦恼,我们创意无限的Nokia公司给小雪和男孩们提出了解决方案:
Nokia公司荣誉出品了一款带有GPRS功能的手机,该手机保存着一个订阅位置变化短信通知的电话列表,当该手机检测到位置发生变化就会向这个订阅列表里的所有手机发送短信。看到Nokia这个解决方案,男孩们和小雪都应该松一口气,他们各自都可以按照自己正常的生活习惯,只有状态发生变化时候各自才会进行通信。
观察者模式还可以用生活中一个例子来表达,就是从邮局订杂志。假如有一个叫 妮妮 的女孩在A邮局订了《时尚女孩》的杂志,又在B邮局订了《知音》杂志,并且告诉这两家邮局,如果杂志到了就给我打电话我自己来拿,然后邮局就在系统中注册下这个女孩姓名,电话等信息。妮妮剩下的就是等邮局的电话来取杂志了。如果杂志到了,邮局打电话给妮妮说,您的杂志到了,请到某某邮局来取(这相当于程序中把对象的引用——邮局名,传给观察者),如果只说您的杂志到了,请到邮局来取,妮妮怎么知道去哪个邮局拿杂志呀。
下面的程序模仿上面的情形,一个随机数产生对象和两个观察者,这两个观察者都在随机数产生对象那里注册了,意思说如果你产生了新的数字,就通知我一声。
结构图:
名称 | 功能说明 |
Observer | 表示观察者的接口,要成为观察者必须实现此接口才行 |
NumberGenerator | 表示产生数值的抽象类 |
RandomNumberGenerator | 产生随机数的类,继承于NumberGenerator |
NumberObserver | 数字观察者,会打印出变化的数字 |
SymbolObserver | 符号观察者,打印N 个符号,打印多少个符号,由接受到的数值确定 |
1.Observer
package com.pattern.observer; public interface Observer { public abstract void update(NumberGenerator generator); }
2.NumberGenerator
package com.pattern.observer; import java.util.ArrayList; import java.util.Iterator; /** * @project JavaPattern * @author sunnylocus * @verson 1.0.0 * @date Aug 27, 2008 1:35:34 PM * @description 产生数值的抽象类 */ public abstract class NumberGenerator { private ArrayList observers = new ArrayList(); //存储Observer /** 添加观察者*/ public void addObserver(Observer observer) { observers.add(observer); } /** 删除观察者*/ public void delObserver(Observer observer) { observers.remove(observer); } /** 通知所有观察者*/ public void notifyObservers() { Iterator it = observers.iterator(); while(it.hasNext()) { Observer o =(Observer) it.next(); o.update(this);//this相当于上面提到的邮局名 } } public abstract int getNumber();//获取数字 public abstract void generate();//产生数字 }
3.RandomNumberGenerator
package com.pattern.observer; import java.util.Random; /** * @project JavaPattern * @author sunnylocus * @verson 1.0.0 * @date Aug 27, 2008 1:48:03 PM * @description 用于产生随机数及通知观察者的类 */ public class RandomNumberGenerator extends NumberGenerator{ private Random random = new Random();//随机数产生器 private int number; //用于存放数字 public void generate() { for(int i=0 ; i < 5; i++) { number = random.nextInt(10);//产生10以内的随机数 notifyObservers(); //有新产生的数字,通知所有注册的观察者 } } /** 获得数字*/ public int getNumber() { return number; } }
4.NumberObserver
package com.pattern.observer; /** 以数字表示观察者的类*/ public class NumberObserver implements Observer{ public void update(NumberGenerator generator) { System.out.println("NumberObserver:"+ generator.getNumber()); try { Thread.sleep(1000 * 3); //为了能清楚的看到输出,休眠3秒钟。 }catch(InterruptedException e) { e.printStackTrace(); } } }
5.SymbolObserver
package com.pattern.observer; /** 以符号表示观察者的类*/ public class SymbolObserver implements Observer{ public void update(NumberGenerator generator) { System.out.print("SymbolObserver:"); int count = generator.getNumber(); for(int i = 0 ; i < count; i ++) { System.out.print("*^_^* "); } System.out.println(""); try { Thread.sleep(1000 * 3); }catch(InterruptedException e){ e.printStackTrace(); } } }
6.Main(测试类)
package com.pattern.observer; public class Main { public static void main(String[] args) { //实例化数字产生对象 NumberGenerator generator = new RandomNumberGenerator(); //实例化观察者 Observer observer1 = new NumberObserver(); Observer observer2 = new SymbolObserver(); //注册观察者 generator.addObserver(observer1); generator.addObserver(observer2); generator.generate(); //产生数字 } }
7.结果输出
设计思想:
观察者模式定义了对象之间的一对多的依赖关系,当一个对象的状态发生改变时,所有它的依赖对象将被自动通知并更新
评论
那个小雪姑娘的故事觉得没有写了,给出代码表达,已经足够清楚了
还是气象站的例子经典。
发表评论
-
人在江湖:如何用代码保护自己
2011-10-12 16:30 11236现在上一点规模的 ... -
Spring freemarker页面乱码解决
2011-01-13 11:56 7482在开发过程中遇到乱码十分的头痛,如果你在开发过程中也遇 ... -
数据漂白算法研究
2010-12-07 18:05 3766你的手机是不是 ... -
理解使用static import 机制
2010-11-09 08:48 3184J2SE 1.5里引入了“Sta ... -
理解多线程设计模式
2010-11-08 17:43 10428多线程设计模式:1.Single Threaded Execu ... -
理解ThreadLocal
2010-11-03 17:04 1915ThreadLocal是什么 早在JDK 1 ... -
经验总结:高性能的数据同步
2010-11-03 10:03 6408最近在做一个银行的生产数据脱敏系统,今天写代码时遇到 ... -
用JSSE实现网络安全通信
2010-06-25 15:11 3825在网络上信息由源主机到目标主机要经过很多路由和计算机, ... -
Java实时监控日志文件并输出
2010-06-19 17:21 61128最近有一个银行数据漂白系统,要求操作人员在页面调用远端 ... -
Junit测试private方法
2010-04-28 14:09 8012package com.bill99.junit; pu ... -
保护眼睛的豆沙色
2010-03-19 09:46 3562作我们IT这行的,一天要盯着电脑看,时间长了眼睛会感觉发酸 ... -
中国联通短信网关接入程序源代码(SGIP1.2协议)
2010-01-11 12:23 42859自从我发了博文“中国联通SP业务开发总结”后有很多的朋友问 ... -
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
2009-12-24 13:14 67455原地址:http://topic.csdn.net/t/200 ... -
非阻塞通信
2009-12-03 11:43 4616对于用ServerSocket和Socket写的服务 ... -
处理线程泄露
2009-12-01 15:10 8566当一个单线程化 ... -
在Timer和ScheduledExecutorService间决择
2009-11-27 10:25 13372java.util.Timer计时器有管理任务延迟执行(& ... -
Socket通信模式:收发线程互斥
2009-11-14 19:09 8727有做过通信程序或着短信接入程序的程序员都知道,与之 ... -
ASCII码对照表
2009-11-12 11:26 2520ASCII表 ASCII值 控制字符 ASC ... -
java.net.SocketException: Software caused connection abort: recv failed 异常分析
2009-11-12 11:01 15685java.net.SocketException: Softw ... -
用State模式减少if..elseif语句
2009-11-03 17:20 7078我们在写程序的过 ...
相关推荐
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
设计模式之观察者模式ObserverPattern
观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计...
观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...
主要介绍了Java设计模式之观察者模式(Observer模式)介绍,Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解,需要的朋友可以...
观察者模式(Observer Pattern) 状态模式(State Pattern) 空对象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 ...
从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。
在设计一组依赖的对象与它们所依赖的对象之间一致(同步)的交流模型时,观察者模式(Observer Pattern)很有用。它可以使依赖对象的状态与它们所依赖的对象的状态保持同步。这组依赖的对象指的是观察者(Observer)...
1、策略模式STRATEGY PATTERN ...16、观察者模式OBSERVER PATTERN 17、责任链模式 18、访问者模式VISITOR PATTERN 19、状态模式 20、原型模式 21、中介者模式 22、解释器模式 23、亨元模式 24、备忘录模式
1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) ...17. 观察者模式 (Observer Pattern)
主要介绍了JavaScript编程设计模式之观察者模式(Observer Pattern),简单说明了观察者模式的概念、原理并结合实例形式详细给出了观察者模式的相关实现与使用技巧,需要的朋友可以参考下
工厂方法模式(Factory Method Pattern) 观察者模式(Observer Pattern) 建造者模式(Builder Pattern) 解释器模式(Interpreter Pattern) 命令模式(Command Pattern) 模板方法模式(Template Method Pattern) 桥接模式...
23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。...观察者模式(Observer) 状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 观察者模式demo java
基于观察者模式和单例模式的java聊天室 面向对象设计,抽象,封装,代理,组合和继承 适合理解java面向对象,socket编程,观察者模式和单例模式
观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. 策略模式...
创建型模式用来处理对象的创建... 观察者模式(Observer Pattern) 状态模式(State Pattern) 策略模式(Strategy Pattern) 模板方法模式(Template Method Pattern) 访问者模式(Visitor Pattern)
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...