- 浏览: 1505213 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (798)
- struts2 (42)
- servlet (20)
- quartz (4)
- jquery & ajax (24)
- tomcat (5)
- javascript (15)
- struts1 (8)
- 搜索关键字及链接 (3)
- fckeditor (3)
- Apache (5)
- spring (22)
- linux (3)
- 企业应用 (8)
- 综合应用 (13)
- 服务器 (2)
- 数据库 (85)
- 性能调优 (21)
- 网络应用 (15)
- 缓存技术 (8)
- 设计模式 (39)
- 面试题 (7)
- 程序人生&前辈程序员 (29)
- java基础 (59)
- hibernate (75)
- log4j (4)
- http (11)
- 架构设计 (28)
- 网页设计 (12)
- java邮件 (4)
- 相关工具 (11)
- ognl (7)
- 工作笔记 (18)
- 知识面扩展 (12)
- oracle异常 (1)
- 正则表达式 (2)
- java异常 (5)
- 项目实践&管理 (1)
- 专业术语 (11)
- 网站参考 (1)
- 论坛话题 (2)
- web应用 (11)
- cxf&webservice (22)
- freemarker (3)
- 开源项目 (9)
- eos (1)
- ibatis (6)
- 自定义标签 (3)
- jsp (3)
- 内部非公开文档(注意:保存为草稿) (0)
- 国内外知名企业 (2)
- 网店 (3)
- 分页 (1)
- 消费者习惯 (2)
- 每日关注 (1)
- 商业信息 (18)
- 关注商业网站 (1)
- 生活常识 (3)
- 新闻 (2)
- xml&JSON (5)
- solaris (1)
- apache.common (3)
- BLOB/CLOB (1)
- lucene (2)
- JMS (14)
- 社会进程 (8)
- SSH扩展 (2)
- 消费心理 (1)
- 珠三角 (1)
- 设计文档 (1)
- XWork&webwork (1)
- 软件工程 (3)
- 数据库及链接 (1)
- RMI (2)
- 国内外知名企业&人物 (1)
最新评论
-
司c马:
简介易懂、
OutputStream和InputStream的区别 -
在世界的中心呼喚愛:
解决我的问题
Java获取客户端的真实IP地址 -
bo_hai:
都是些基本的概念呀!
SSO -
tian_4238:
哥们,你也是搞水利这块的吧。
巧用SQLQuery中的addScalar -
loveEVERYday:
java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp小结
出版者+订阅者==观察者模式
报纸的订阅
出版者改称为”主题“(Subject),订阅者改称为”观察者“(Observer)
观察者模式定义了一系列对象之间的一对多关系。
当一个对象改变状态,其他依赖者都会收到通知。
主题:
这样或许不行,只是我必须因此门户大开,让你们全都可以进来取得你们需要的状态,这样太危险了。我不能让你们进来里面大肆挖掘我的各种数据
观察者:
为何由你主动送数据过来,而不是让我们主动去向你索取数据?
你 何不提供一些公开的getter方法,让我们”拉“走我们需要的状态?
观察者模式定义了对象间的一对多依赖关系,让一个或多个观察者对象观察一个主题对象。当主题对象的状态发生变化时,系统能通知所有的依赖于此对象的观察者对象,从而使得观察者对象能够自动更新。
在观察者模式中,被观察的对象常常也被称为目标或主题(Subject),依赖的对象被称为观察者(Observer)。
下面以一个简单的示例来示范观察者模式,程序先提供一个观察者接口:
程序清单:codes\09\9.3\Observer\Observer.java
public interface Observer { void update(Observable o , Object arg); } |
上面Observer接口是一个观察者接口,程序中所有观察者都应该实现该接口。在该接口的update()方法中包含了一个Observable类型的参数,该参数代表被观察对象,也就是前面介绍的目标或主题。此处的Observable是一个抽象基类,程序中被观察者应该继承该抽象基类。
Observable类的代码如下:
程序清单:codes\09\9.3\Observer\Observable.java
public abstract class Observable { //用一个List来保存该对象上所有绑定的事件监听器 List<Observer> observers = new ArrayList<Observer>(); //定义一个方法,用于从该主题上注册观察者 public void registObserver(Observer o) { observers.add(o); } //定义一个方法,用于从该主题中删除观察者 public void removeObserver(Observer o) { observers.add(o); } //通知该主题上注册的所有观察者 public void notifyObservers(Object value) { //遍历注册到该被观察者上的所有观察者 for (Iterator it = observers.iterator(); it.hasNext(); ) { Observer o = (Observer)it.next(); //显示每个观察者的update方法 o.update(this , value); } } } |
该Observable抽象类是所有被观察者的基类,它主要提供了registObserver()方法用于注册一个新的观察者;并提供了一个removeObserver()方法用于删除一个已注册的观察者;当具体被观察对象的状态发生改变时,具体被观察对象会调用notifyObservers方法来通知所有观察者。
下面提供一个具体的被观察者类:Product,该产品有两个属性,它继承了Observable抽象基类。程序如下:
程序清单:codes\09\9.3\Observer\Product.java
public class Product extends Observable { //定义两个属性 private String name; private double price; //无参数的构造器 public Product(){} public Product(String name , double price) { this.name = name; this.price = price; } public String getName() { return name; } //当程序调用name的setter方法来修改Product的name属性时 //程序自然触发该对象上注册的所有观察者 public void setName(String name) { this.name = name; notifyObservers(name); } public double getPrice() { return price; } //当程序调用price的setter方法来修改Product的price属性时 //程序自然触发该对象上注册的所有观察者 public void setPrice(double price) { this.price = price; notifyObservers(price); } } |
正如程序中两行粗体字代码所示,当程序调用Product对象的setName()、setPrice()方法来改变Product的name、price属性时,这两个方法将自动触发Observable基类的notifyObservers方法。
接下来程序提供两个观察者,一个用于观察Product对象的name属性,另一个用于观察Product对象的price属性。
程序清单:codes\09\9.3\Observer\NameObserver.java
public class NameObserver implements Observer { //实现观察者必须实现的update方法 public void update(Observable o , Object arg) { if (arg instanceof String ) { //产品名称改变值在name中 String name = (String)arg; //启动一个JFrame窗口来显示被观察对象的状态改变 JFrame f = new JFrame("观察者"); JLabel l = new JLabel("名称改变为:" + name); f.add(l); f.pack(); f.setVisible(true); System.out.println("名称观察者:" + o + "物品名称已经改变为: " + name); } } } |
程序清单:codes\09\9.3\Observer\PriceObserver.java
public class PriceObserver implements Observer { //实现观察者必须实现的update方法 public void update(Observable o , Object arg) { if(arg instanceof Double) { System.out.println("价格观察者:" + o + "物品价格已经改变为: " + arg); } } } |
接着主程序创建一个Product对象(被观察的目标对象),然后向该被观察对象上注册两个观察者对象,当主程序调用Product对象的setter方法来改变该对象的状态时,注册在Product对象上的两个观察者将被触发。主程序代码如下:
程序清单:codes\09\9.3\Observer\Test.java
public class Test { public static void main(String[] args) { //创建一个被观察者对象 Product p = new Product("电视机" , 176); //创建两个观察者对象 NameObserver no = new NameObserver(); PriceObserver po = new PriceObserver(); //向被观察对象上注册两个观察者对象 p.registObserver(no); p.registObserver(po); //程序调用setter方法来改变Product的name和price属性 p.setName("书桌"); p.setPrice(345f); } } |
运行上面程序,我们将可看到当Product的属性值发生改变时,注册在该Product上的NameObserver和PriceObserver将被触发。
纵观上面介绍的观察者模式,我们发现观察者模式通常包含如下4个角色:
被观察者的抽象基类:它通常会持有多个观察者对象的引用。Java提供了java.util.Observable基类来代表被观察者的抽象基类,所以实际开发中无须自己开发这个角色。
观察者接口:该接口是所有被观察对象应该实现的接口,通常它只包含一个抽象方法update()。Java同样提供了java.util.Observer接口来代表观察者接口,实际开发中也无须开发该角色。
被观察者实现类:该类继承Observable基类。
观察者实现类:实现Observer接口,实现update抽象方法。
理解了上面观察者模式的实现思路之后,可能有读者会感到疑惑:观察者模式的实现方式与Java事件机制的底层实现何其相似啊?实际上,我们完全可以把观察者接口理解成事件监听接口,而被观察者对象也可当成事件源来处理——换个角度来思考:监听,观察,这两个词语之间有本质的区别吗?Java事件机制的底层实现,本身就是通过观察者模式来实现的。
除此之外,观察者模式在Java EE应用中也有广泛应用,主题/订阅模式下的JMS(Java Message Service,Java消息服务)本身就是观察者模式的应用。图9.12显示了主题/订阅模式下JMS的示意图。
图9.12 主题/订阅模式下JMS的示意图 |
从图9.12中可以看出,当Topic主题收到发布者(Publisher)发布的消息时,注册到该主题的所有订阅者(Subscriber)都可收到该消息。实际上,Java EE把这个Topic设计成一个被观察者,而所有订阅者都注册到该被观察者,当发布者发布消息时,该消息将会引起Topic主题的改变,这种改变将会触发注册到该Topic上的所有观察者。
发表评论
-
设计模式系列-适配器模式(&几种模式的链接)
2011-09-02 15:55 2101一、上篇回顾 通过上篇的简单讲解,我们知道了,组 ... -
java回调函数
2011-09-01 16:31 1453所谓回调,就是客户程序C调用服务程序S中的某个方法a,然后S又 ... -
深入浅出java命令模式
2011-08-20 14:39 1146一、引言 忙里偷闲, ... -
Java命令模式:设计模式的四人帮
2011-08-20 11:47 1741本文介绍了一个Java设 ... -
Java命令模式:设计模式的四人帮
2011-08-20 11:07 2本文介绍了一个Java设 ... -
桥接模式
2011-07-14 14:27 3842桥接模式是一种结构型模式,它主要应对的是:由于实际的需要,某个 ... -
Java设计模式圣经连载(03)-抽象工厂模式
2011-07-05 09:18 12671.3 抽象工厂(Abstract F ... -
模板方法设计模式
2011-07-04 22:49 1292Template模板模式定义: ... -
JDK里的设计模式
2011-06-28 16:07 1383下面是JDK中有关23个经典设计模式的示例,在stakeove ... -
UML类图关系全面剖析
2011-06-28 10:38 2100UML的类图关系分为: 关联、聚合/组合、依赖、泛化(继承)。 ... -
设计模式-火龙果
2011-06-22 16:19 1205鸭子-策略模式(Strategy) http://www.u ... -
设计模式之六大原则——单一职责原则(SRP)
2010-10-19 08:48 1960开闭原则(Open Closed Pr ... -
状态模式和策略模式的比较
2010-09-27 19:56 1234状态模式(state pattern)和 ... -
简单工厂模式-《java与模式》
2010-09-26 19:50 1363缺点: 1、工厂类成为 ... -
门面模式-《java与模式》
2010-09-26 19:01 14751、医院的例子 病人 ... -
相关知识
2010-09-21 15:14 11451、java设计模式之实例详解http://java.chin ... -
工厂模式-设计模式-笔记(一)
2010-09-09 18:33 1268我们不应该针对实现编程,但是当我每次使用new时,不正是在针对 ... -
装饰者模式-设计模式-笔记(二)
2010-09-08 08:38 1542装饰java.io类: InputStream //抽象组件 ... -
来杯咖啡-装饰者模式(Decorator)
2010-09-07 21:31 1488前言 上篇【观察者模 ... -
设计模式-笔记(三)
2010-09-06 10:56 1414设计原则: 多用组合,少用继承 以上笔记介绍的是策略 ...
相关推荐
HeadFirst的设计模式系列书籍以其直观易懂的方式深受程序员喜爱,本笔记将深入探讨观察者模式的概念及其应用。 观察者模式的核心思想是定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的...
观察者模式是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这个模式在很多场景下都有广泛的应用,例如事件处理、...
031114_【第11章:Java常用类库】_观察者设计模式笔记
本文主要关注的是Java编程语言中的设计模式,结合“Java与模式-笔记二”的博客内容,我们将深入探讨其中的一些核心设计模式及其在实际开发中的应用。 首先,我们来谈谈单例模式(Singleton)。单例模式确保一个类...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。
行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...
设计模式是一种在软件设计中被广泛认可的解决特定问题的模板,它代表了最佳实践,是经验丰富的开发者在面临相似...这份笔记是理解设计模式的一个极好资源,对于想要提升软件设计能力的程序员来说,具有很高的参考价值。
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...
观察者模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在构建事件驱动或响应式系统时。这个模式的核心思想是定义一个对象的“发布-订阅”机制,使得多个“观察者”可以关注某个“主题”,...
5. 观察者模式:定义对象间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并被自动更新。 6. 状态模式:允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 7. ...
18. **观察者**(Observer):定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 19. **状态**(State):允许一个对象在其内部状态改变时改变它的行为,对象...
此外,还有一些其他的重要模式,如观察者模式(Observer),它定义了对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。职责链模式(Chain of Responsibility)让多...
在《深入浅出设计模式》的学习笔记中,我们可以看到几种关键的设计模式及其应用,包括策略模式、观察者模式、装饰者模式、工厂模式和抽象工厂模式。 1. **策略模式**: - 策略模式的核心在于将算法族封装在独立的...
### 设计模式学习笔记 #### 一、设计模式概述 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案。设计...
设计模式是软件开发中的一种最佳实践,用于解决常见的设计问题并提供可重用的解决方案。在本文档中,我们主要探讨了设计模式的基本概念和分类,以及“状态机模式”这一特定的设计模式。 首先,设计模式可以分为三大...
设计模式是软件开发中的一种重要概念,它是经过时间验证、广泛认可的代码设计经验的总结。设计模式可以被归类为创建型、结构型和行为型三类,每类包含若干种模式,如创建型中的工厂方法模式、抽象工厂模式、单例模式...
这份由台湾作者编写的笔记,结合Java语言,为读者提供了一种深入理解并应用设计模式的方式。以下是对这些设计模式的详细解释: 1. **创建型模式(Creational Patterns)** 创建型模式关注于对象的创建过程,它们帮助...