- 浏览: 341345 次
- 性别:
- 来自: 广州
文章分类
最新评论
观察者模式是对象的行为模式,观察者模式定义了一种一对多的依赖关系,许多个观察者对象同时监听某个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己.一个软件系统里包含各种对象,就像一片欣欣向荣的森林有各种生物一样,在一片森林里,各种生物彼此依赖和约束,形成一个个生物链,一种生物的状态变化会造成其他一些生物的相应变化,每一个生物都处于和别的生物的互动之中.
一:观察者模式中的角色
(A)抽象主题(Subject)角色:主题角色把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现.
(B)抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口,抽象观察者一般用一个抽象类或者一个接口实现.
(C)具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知,具体主题角色又叫作具体被观察者角色(ConcreteObservable).
(D)具体观察者(ConcreteObserver)角色:具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态协调.
在上面的四个角色中,更新接口只有一个更新方法,具体主题对象可以含有任意多个对抽象观察者对象的引用。当然抽象类不可能有实例,因此这些引用的真实类型必然是ConcreteObserver类型,而这些引用的静态类型是Observer类型,这意味着主题对象不需要知道引用了哪些ConcreteObserver类型,而只知道抽象Observer类型,这就使得具体主题对象可以动态地维护一系列的对观察者对象的引用,并在需要的时候调用每一个观察者共有的update方法,这种做法就叫做"针对接口编程".
下面是示意代码:
package cai.milenfan.basic.test;
/*这个抽象主题接口规定出三个子类必须实现的操作,即attach用来增加一个对象者对象,detach用来删除
*一个已经登记过的观察者对象,notifyObservers用来通知各个观察者更新它们自己
*/
下面给出另一种实现方案,这个方案和Java中的观察者模式一致,由于在这个方案里抽象主题角色必须实现一些方法,所以不再使用接口,而应当采用抽象Java类,代码如下:
二:Java语言提供的对观察者模式的支持
在Java语言的java.util库里面,提供了一个Observable类及一个Observer接口,构造Java语言对观察者模式的支持
(A)Observer接口
这个接口只定义了一个方法,即update方法,当被观察者对象的状态发生变化时,被观察者对象的notifyObservers(B)Observable类
被观察者类者是java.util.Observable类的子类,java.util.Observable提供公开的方法支持观察者对象,这些方法中有两个对Observable的子类非常重要,一个是setChanged(),另一个是notifyObservers()。
这个Observable类代表一个被观察者对象,有时称之为主题对象,一个被观察者对象可以有数个观察者对象,每个观察者都是Observer接口的对象,在被观察者对象发生变化时,它会调用Observable的notifyObserver方法,此方法调用所有的具体观察者的update方法,从而使所有的观察者都被通知更新自己.
怎么使用Java对观察者模式的支持,下面给出示意代码:
一:观察者模式中的角色
(A)抽象主题(Subject)角色:主题角色把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现.
(B)抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口,抽象观察者一般用一个抽象类或者一个接口实现.
(C)具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知,具体主题角色又叫作具体被观察者角色(ConcreteObservable).
(D)具体观察者(ConcreteObserver)角色:具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态协调.
在上面的四个角色中,更新接口只有一个更新方法,具体主题对象可以含有任意多个对抽象观察者对象的引用。当然抽象类不可能有实例,因此这些引用的真实类型必然是ConcreteObserver类型,而这些引用的静态类型是Observer类型,这意味着主题对象不需要知道引用了哪些ConcreteObserver类型,而只知道抽象Observer类型,这就使得具体主题对象可以动态地维护一系列的对观察者对象的引用,并在需要的时候调用每一个观察者共有的update方法,这种做法就叫做"针对接口编程".
下面是示意代码:
package cai.milenfan.basic.test;
/*这个抽象主题接口规定出三个子类必须实现的操作,即attach用来增加一个对象者对象,detach用来删除
*一个已经登记过的观察者对象,notifyObservers用来通知各个观察者更新它们自己
*/
interface Subject { public void attach(Observer observer); public void detach(Observer observer); void notifyObservers(); }
package cai.milenfan.basic.test; import java.util.Enumeration; import java.util.Vector; /*具体主题角色是实现了抽象主题Subject的一个具体类,它给出了以上三个操作的具体实现 */ public class ConcreteSubject implements Subject{ private Vector observersVector = new java.util.Vector(); public void attach(Observer observer) { observersVector.addElement(observer); } public void detach(Observer observer){ observersVector.removeElement(observer); } public void notifyObservers(){ java.util.Enumeration enumeration = observers(); while (enumeration.hasMoreElements()) { ((Observer)enumeration.nextElement()).update(); } } public Enumeration observers(){ return ((java.util.Vector) observersVector.clone()).elements(); } }
package cai.milenfan.basic.test; //抽象观察者角色 public interface Observer { void update(); }
package cai.milenfan.basic.test; public class ConcreteObserver implements Observer{ public void update() { //write your code here } }
下面给出另一种实现方案,这个方案和Java中的观察者模式一致,由于在这个方案里抽象主题角色必须实现一些方法,所以不再使用接口,而应当采用抽象Java类,代码如下:
package cai.milenfan.basic.test; import java.util.Enumeration; import java.util.Vector; /*这个抽象主题接口规定出三个子类必须实现的操作,即attach用来增加一个对象者对象,detach用来删除 *一个已经登记过的观察者对象,notifyObservers用来通知各个观察者更新它们自己 */ abstract public class Subject { private Vector observersVector = new java.util.Vector(); public void attach(Observer observer){ observersVector.addElement(observer); System.out.println("Attached an observer."); } public void detach(Observer observer){ observersVector.removeElement(observer); } public void notifyObservers(){ java.util.Enumeration enumeration = observers(); while (enumeration.hasMoreElements()){ System.out.println("Before notifying"); ((Observer)enumeration.nextElement()).update(); } } public Enumeration observers() { return ((java.util.Vector) observersVector.clone()).elements(); } }
package cai.milenfan.basic.test; //这个角色轻便多了,只需要一个改变内部状态的方法 public class ConcreteSubject extends Subject{ private String state; public void change(String newState){ state = newState; this.notifyObservers(); } }
package cai.milenfan.basic.test; public class Client{ private static ConcreteSubject subject; private static Observer observer; public static void main(String[] args){ subject = new ConcreteSubject(); observer = new ConcreteObserver(); subject.attach(observer); subject.change("new state"); } }
二:Java语言提供的对观察者模式的支持
在Java语言的java.util库里面,提供了一个Observable类及一个Observer接口,构造Java语言对观察者模式的支持
(A)Observer接口
这个接口只定义了一个方法,即update方法,当被观察者对象的状态发生变化时,被观察者对象的notifyObservers(B)Observable类
被观察者类者是java.util.Observable类的子类,java.util.Observable提供公开的方法支持观察者对象,这些方法中有两个对Observable的子类非常重要,一个是setChanged(),另一个是notifyObservers()。
这个Observable类代表一个被观察者对象,有时称之为主题对象,一个被观察者对象可以有数个观察者对象,每个观察者都是Observer接口的对象,在被观察者对象发生变化时,它会调用Observable的notifyObserver方法,此方法调用所有的具体观察者的update方法,从而使所有的观察者都被通知更新自己.
怎么使用Java对观察者模式的支持,下面给出示意代码:
package cai.milenfan.basic.test; import java.util.Observable; public class Watched extends Observable{ private String data = ""; public String retrieveData(){ return data; } public void changeData(String data){ if ( !this.data.equals( data) ){ this.data = data; setChanged(); } notifyObservers(); } }
package cai.milenfan.basic.test; import java.util.Observable; public class Watcher implements Observer{ public Watcher(Watched w){ w.addObserver((java.util.Observer) this); } public void update( Observable ob, Object arg){ System.out.println("Data has been changed to: '" ((Watched)ob).retrieveData() "'"); } public void update() { } }
package cai.milenfan.basic.test; public class Tester { static private Watched watched; static private Observer watcher; public static void main(String[] args){ watched = new Watched(); watcher = new Watcher(watched); watched.changeData("In C, we create bugs."); watched.changeData("In Java, we inherit bugs."); watched.changeData("In Java, we inherit bugs."); watched.changeData("In Visual Basic, we visualize bugs."); } }
发表评论
-
Mina重连
2014-05-26 21:29 2927import com.sun.swing.internal. ... -
面试经典
2014-05-24 09:29 6431.mysql innodb引擎,什么叫聚集索引,与非聚集索 ... -
一拍网网站系统架构图
2014-03-28 21:24 623一拍网网站系统架构图 -
Window下安装配置nginx
2013-08-12 16:53 809安装:http://www.cnblogs.com/wen ... -
使用线程池的好处
2013-07-18 14:41 1252使用线程池有两个好处: 1.可以创建和销毁线程所带来的系统 ... -
Java ThreadLocal使用浅析
2013-07-18 14:36 483ThreadLocal通过在其内部保存变量的副本,并且各个副本 ... -
MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
2013-07-05 13:06 1177http://blog.csdn.net/zhangwei ... -
分享一位网友的架构杂谈
2013-05-20 23:16 913不容类型的网站,并发处理不一样,例如针对sns这种类型的网站 ... -
JSP页面静态化
2013-04-08 09:20 890http://www.java-zone.org/644.ht ... -
Java compile to C++
2013-03-19 14:53 507http://code.google.com/a/eclips ... -
几个TCP Socket的通信框架
2013-03-19 12:26 996http://www.oschina.net/p/simple ... -
宝贝鱼
2013-03-18 23:54 692http://code.google.com/p/cshbbr ... -
将Java程序注册成系统服务(NT服务)
2013-03-16 16:14 604http://blog.csdn.net/small____f ... -
Java内存回收机制
2013-03-13 15:47 814http://www.iteye.com/blogs/tag/ ... -
支付宝,百付宝集成
2013-03-13 14:01 975http://help.alipay.com/support/ ... -
SSH+EXTJS项目下载
2013-03-11 23:02 437http://download.csdn.net/tag/Ex ... -
Hibernate中使用Threadlocal创建线程安全的Session
2013-03-04 20:39 592http://blog.sina.com.cn/s/blog_ ... -
Java Socket多线程通信
2012-10-09 09:53 839当Server没接受到一个Client连接请求之后,都把处理流 ... -
Java 多线程的一个例子
2012-10-09 09:48 1024目录: 1 synchronized的 ... -
app引擎
2012-07-10 09:39 0http://sae.sina.com.cn/ htt ...
相关推荐
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的编程...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...
观察者模式是软件设计模式中的一种行为模式,它在对象之间定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动编程、发布/订阅系统...
观察者模式是设计模式中的一种行为模式,它在Java编程中有着广泛的应用。该模式的主要目的是定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式也被...
7. **其他变体**:除了基本的观察者模式,还有复合观察者模式,允许一个观察者对象包含多个观察者,以及异步观察者模式,通知过程在不同的线程中执行,以避免阻塞主线程。 在实际开发中,理解并熟练运用观察者模式...
观察者模式,也被称为发布-订阅模式,是软件设计中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在分布式系统、事件驱动...
在观察者模式中,有四个主要角色: 1. **主题(Subject)**:这是被观察的对象,它保存了一个观察者列表,并提供了添加、删除观察者以及通知所有观察者更新的方法。在Java代码示例中,`Subject` 接口定义了这些方法...
**C#面向对象设计模式纵横谈(19)**:**观察者模式**(Observer Pattern)是行为型模式的一种,它在软件工程中扮演着至关重要的角色。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...
观察者模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在构建可扩展和可维护的系统时。在这个实例中,我们将深入理解如何在Java中实现观察者模式,以及它如何利用继承和多态性来增强概念...
观察者模式详解 观察者模式(Observer Design Pattern)是行为型设计模式的一种,主要解决的是“类或对象之间的交互”问题。它定义了一个一对多的依赖关系,当一个对象的状态改变时,所有依赖的对象都会自动收到...
四、观察者模式的优点 观察者模式有以下几点优点: * 松耦合:观察者模式使得观察者和被观察者之间松耦合,易于维护和修改。 * 实时更新:观察者模式可以实时更新观察者,提高系统的响应速度。 * 扩展性强:观察者...
观察者模式的结构中包括四种角色: * 主题(Subject):定义了一个接口,规定了添加、删除观察者以及通知观察者更新数据的方法。 * 观察者(Observer):定义了一个接口,规定了更新数据的方法。 * 具体主题...
观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或者发布...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...
观察者模式是面向对象设计中的一种经典模式,它在软件工程中扮演着重要的角色,用于实现对象间的松耦合。这种模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...
#### 四、观察者模式的基本角色 观察者模式主要包括以下几种角色: 1. **主题(Subject)**:也称作被观察者。它负责维护观察者列表,并在自身状态发生变化时通知所有观察者。主题接口通常定义了添加观察者、删除...
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的其他对象。在Java中,这种模式已经被内置到语言核心,使得开发者可以轻松地实现事件驱动...