- 浏览: 81304 次
- 性别:
- 来自: 深圳
最新评论
-
月亮不懂夜的黑:
[color=orange][/color][/color][ ...
二叉树的深度优先和广度优先遍历 -
月亮不懂夜的黑:
<font color='re ...
二叉树的深度优先和广度优先遍历 -
zhufeng1981:
...
正在为理想而奋斗的程序员进来看看
观察者模式要点:
1.观察者模式定义了对象之间一对多的关系
2.主题(也就是可观察者)用一个共同的接口来更新观察者
3.观察者和可观察者之间用松耦合方式,可观察者不知道观察者的细节,只知道观察者实现了观察者接口
4.使用此模式时,你可从被观察者处推或拉数据
5.有多个观察者时,不可以以来特定的通知次序
6.java有多种观察者模式的实现,包括通用的java.util.Observable
7.要注意java.util.Observable实现上所来来的一些问题
8.Swing大量使用观察者模式,许多GUI框架也是如此
9.此模式也被应用在许多地方,例如:JavaBean、RMI
观察者模式:在对象之间定义一对多的依赖,这样一来,档一个对象改变状态,依赖它的对象都会收到通知,并自动更新。
结构总结:从具体主题角色指向抽象观察者角色的合成关系,代表具体主题对象可以有任意多个对抽象观察者对象的引用。之所以使用抽象观察者而不是具体观察者,意味着主题对象不需要知道引用了哪些ConcreteObserver类型,而只知道抽象Observer类型。这就使得具体主题对象可以动态地维护一系列的对观察者对象的引用,并在需要的时候调用每一个观察者共有的Update()方法。这种做法叫做"针对抽象编程"。
观察者模式的优缺点:
Observer模式的优点是实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,并抽象了更新接口,使得可以有各种各样不同的表示层(观察者)。但是其缺点是每个外观对象必须继承这个抽像出来的接口类,这样就造成了一些不方便,比如有一个别人写的外观对象,并没有继承该抽象类,或者接口不对,我们又希望不修改该类直接使用它。虽然可以再应用Adapter模式来一定程度上解决这个问题,但是会造成更加复杂烦琐的设计,增加出错几率。
观察者模式的效果有以下几个优点:
(1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体现察者聚集,每一个具体现察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。
(2)观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。
观察者模式有下面的一些缺点:
(1)如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
(2)如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察考模式时要特别注意这一点。
(3)如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。
(4)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化
public interface Subject { public void register(Observer observer); public void remove(Observer observer); public void notifiedObserver(); }
public interface Observer { public void update(float temp, float humidity, float pressure); }
import java.util.*; public class WeatherDate implements Subject { private float temp; private float humidity; private float pressure; List list = new ArrayList(); public void register(Observer observer) { list.add(observer); } public void remove(Observer observer) { int i = list.indexOf(observer); if (i >= 0) { list.remove(i); } } public void notifiedObserver() { for (int i = 0; i < list.size(); i++) { Observer observer = (Observer) list.get(i); observer.update(temp, humidity, pressure); } } public void changeDate() { notifiedObserver(); } public void setMeasure(float temp, float humidity, float pressure) { this.temp = temp; this.humidity = humidity; this.pressure = pressure; changeDate(); } }
public class CurrentConditionsDisplay implements Observer { private float temp; private float humidity; private float pressure; private WeatherDate wd ; public CurrentConditionsDisplay(WeatherDate wd){ this.wd = wd; wd.register(this); } public void update(float temp, float humidity, float pressure) { this.temp = temp; this.humidity = humidity; this.pressure = pressure; display(); } public void display(){ System.out.println("Current condition:"+ temp+"F degrees and" +humidity +"%humidty"); } }
public class WeatherStation { public static void main(String[] args) { WeatherDate weatherdate = new WeatherDate(); CurrentConditionsDisplay condition = new CurrentConditionsDisplay( weatherdate); weatherdate.setMeasure(80, 65, 70); } }
发表评论
-
不错的经典算法java和c两种实现(含代码图文解释)(转)
2010-03-05 20:55 1421通过Java C语言分别实现各种算法,图文并茂,描述很详细! ... -
MyEclipse配置Tomcat(图解)
2009-11-24 10:14 18391) 安装完MyEclipse 后 ... -
Apache的80端口被占用【文章教程】
2009-11-24 10:13 2712哎呀!~今天突然发现我的APMserv启动时发现Apache的 ... -
Spring学习笔记之bean和BeanFactory
2009-11-12 21:27 01.bean定义和bean实例化 bean ... -
Spring学习笔记之依赖注入(更新中)
2009-11-12 20:45 904Spring为企业应用开发提供一个轻量级的解决方案。该 ... -
65个源代码网站
2009-11-07 20:28 13551.51源码:http://www.51aspx.com/ ... -
归并排序
2009-10-21 10:50 735http://yuan.iteye.com/blog/3087 ... -
Swing编程总结
2009-09-04 19:49 0为了显示一个窗口,每 ... -
java 输入流与输出流相关知识
2009-09-04 10:31 2914流是生产或消费信息的一种抽象描述,通过java的输入 ... -
线程相关知识
2009-08-27 14:45 721进程本质上是一个执行的程序。每个进程都有自己独立的一块内存空间 ... -
国外开源软件网站-收
2009-08-08 08:02 1463sourceforge http://www.sourcefo ... -
JSP指令之page指令
2009-08-07 21:40 1558page指令用于为容器提供指示,这些指示将应用于当 ... -
JSP指令基础
2009-08-07 20:37 916JSP指令不是JSP代码中逻辑的一部分。相反,JS ... -
不错的设计模式学习网站
2009-08-07 08:55 731http://www.riabook.cn/doc/desig ... -
23种设计模式
2009-08-05 21:30 8621、工厂模式:客户类和 ... -
head first 设计模式之代理模式之总结
2009-08-05 15:32 0代理模式要点: ... -
head first 设计模式之策略模式之总结
2009-08-05 14:07 0策略模式的要点: 1、Strategy及其子类为组件提 ... -
head first 设计模式之状态模式之总结
2009-08-05 09:31 1244状态模式要点: ... -
开发人员一定要加入收藏夹的网站
2009-08-02 21:24 666http://www.gotapi.com/语言: ... -
Head First 设计模式之单件模式之总结
2009-08-02 15:40 1032单件模式要点: 1.单件模式确保程序中一个类最多只有 ...
相关推荐
head first 设计模式 观察者模式 C++ 代码
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 Observer Pattern defines a one-to-many dependency between objects so that when one object ...
NULL 博文链接:https://jacky-dai.iteye.com/blog/1132063
HeadFirst 设计模式学习笔记2--观察者模式 demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5581769.aspx
最近在看head first 设计模式,书上的例子是用java编写的.因为工作上C用的比较多,所以决定编看书,边用C++也编写书上的例子.既可以加深对设计模式的理解,也顺便练习下c++. 希望这写代码也能帮助别人学习c++和设计模式...
中文扫描版文档,高清。在pad上可以放大使用也不会模糊!!!!内含的设计模式有:观察者模式等...
所有的设计模式Java实现。 第一讲:简单工厂模式 第二讲:工厂方法模式 第三讲:抽象工厂模式 第四讲:工厂模式在开发中的运用 第五讲:单例模式 第六讲:原型模式 ...第三十讲:设计模式总结
2 观察者模式 让你的对象知悉现况 3 装饰者模式 装饰对象 4 工厂模式 烘烤OO的精华 5 单件模式 独一无二的对象 6 命令模式 封装调用 7 适配器模式与外观模式 随遇模式 8 模板方法模式 封装算法 9 选代器与组合模式 ...
2 观察者模式 让你的对象知悉现况 3 装饰者模式 装饰对象 4 工厂模式 烘烤OO的精华 5 单件模式 独一无二的对象 6 命令模式 封装调用 7 适配器模式与外观模式 随遇模式 8 模板方法模式 封装算法 9 选代器与组合模式 ...
经典的设计模式,单例模式、工厂模式、装饰模式、观察者模式
Head.First设计模式_PDF(高清扫描版) 第一部分(共三部分) 在我的资源下可找到其他两部部分 强大的写作阵容。《Head First设计模式》作者Eric Freeman和ElElisabeth Freeman是作家、讲师和技术顾问。Eric拥有耶鲁...
2观察者模式让你的对象知悉现况 3装饰者模式装饰对象 4工厂模式烘烤OO的精华 5单件模式独一无二的对象 6命令模式封装调用 7适配器模式与外观模式随遇模式 8模板方法模式封装算法 9选...
HeadFirst源代码,所有设计模式JAVA代码,观察者模式,装饰者模式,工厂模式,单件模式,命令模式,适配器模式,外观模式等
Head.First.设计模式.中文版 1 欢迎来到设计模式世界:设计模式入门 模拟鸭子应用 Joe想到继承 利用接口如何? 软件开发的不变真理 分开变化和不变部分 设计鸭子的行为 测试鸭子的代码 动态地设置...
根据《HeadFirst 设计模式》自己操作实现的观察者模式Java代码
C#,设计模式,观察者模式,气像站,C#,设计模式,观察者模式,气像站,,这是 Head First 上面所用的例子,有一点修改,始其可以直接运行。
观察者模式的简单例子,根据《Head First设计模式》第2章中的天气预告版的例子编写
1 欢迎来到设计模式世界:设计模式入门 模拟鸭子应用 Joe想到继承 利用接口如何? 软件开发的不变真理 分开变化和不变部分 设计鸭子的行为 测试鸭子的代码 动态地设置行为 封装行为的大局观 ...