我们这里简单用代码描述如下:
package observer.desc; /** * *作者:alaric *时间:2013-8-13下午8:05:08 *描述:抽象观察者 */ public interface Observer { public void update(); }
package observer.desc; /** * *作者:alaric *时间:2013-8-13下午8:05:34 *描述:具体观察者 */ public class ConcreteObserver implements Observer{ @Override public void update() { // 写业务逻辑 } }
package observer.desc; /** * *作者:alaric *时间:2013-8-13下午8:05:55 *描述:抽象主题 */ public interface Subject { public void attach(Observer observer); public void detach(Observer observer); void notifyObservers(); }
package observer.desc; import java.util.Enumeration; import java.util.Vector; /** * *作者:alaric *时间:2013-8-13下午8:09:21 *描述:具体主题类 */ public class ConcreteSubject implements Subject { private Vector<Observer>observersVector = new Vector<Observer>(); public void attach(Observer observer) { observersVector.addElement(observer); } public void detach(Observer observer) { observersVector.removeElement(observer); } public void notifyObservers() { Enumeration<Observer>enumeration = observers(); while (enumeration.hasMoreElements()) { ((Observer) enumeration.nextElement()).update(); } } @SuppressWarnings("unchecked") public Enumeration<Observer> observers() { return ((Vector<Observer>) observersVector.clone()).elements(); } }
jdk1.6中API文档如下描述:
public interface Observer
一个可在观察者要得到 observable 对象更改通知时可实现 Observer 接口的类。
从以下版本开始:
JDK1.0
另请参见:
Observable
public class Observableextends Object
此类表示模型视图范例中的 observable 对象,或者说“数据”。可将其子类化,表示应用程序想要观察的对象。
一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象。一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。
未指定发送通知的顺序。Observable 类中所提供的默认实现将按照其注册的重要性顺序来通知 Observers,但是子类可能改变此顺序,从而使用非固定顺序在单独的线程上发送通知,或者也可能保证其子类遵从其所选择的顺序。
注意,此通知机制与线程无关,并且与 Object 类的 wait 和 notify 机制完全独立。 新创建一个 observable 对象时,其观察者集是空的。当且仅当 equals 方法为两个观察者返回 true 时,才认为它们是相同的。
从以下版本开始:
JDK1.0
另请参见:
notifyObservers(), notifyObservers(java.lang.Object), Observer, Observer.update(java.util.Observable, java.lang.Object)
package observer; import java.util.List; import java.util.Observable; import java.util.Observer; /** * *作者:alaric *时间:2013-8-13下午9:32:40 *描述:警察张三 */ public class Police extends Observable { private String time ; public Police(List<Observer> list) { super(); for (Observer o:list) { addObserver(o); } } public void change(String time){ this.time = time; setChanged(); notifyObservers(this.time); } }
package observer; import java.util.Observable; import java.util.Observer; /** * *作者:alaric *时间:2013-8-13下午9:32:59 *描述:卧底A */ public class UndercoverA implements Observer { private String time; @Override public void update(Observable o, Object arg) { time = (String) arg; System.out.println("卧底A接到消息,行动时间为:"+time); } }
package observer; import java.util.Observable; import java.util.Observer; /** * *作者:alaric *时间:2013-8-13下午9:33:14 *描述:卧底B */ public class UndercoverB implements Observer { private String time; @Override public void update(Observable o, Object arg) { time = (String) arg; System.out.println("卧底B接到消息,行动时间为:"+time); } }
package observer; import java.util.ArrayList; import java.util.List; import java.util.Observer; /** * *作者:alaric *时间:2013-8-13下午9:32:26 *描述:测试 */ public class Client { /** * @param args */ public static void main(String[] args) { UndercoverA o1 = new UndercoverA(); UndercoverB o2 = new UndercoverB(); List<Observer> list = new ArrayList<>(); list.add(o1); list.add(o2); Police subject = new Police(list); subject.change("02:25"); System.out.println("===========由于消息败露,行动时间提前========="); subject.change("01:05"); } }
测试运行结果:
卧底B接到消息,行动时间为:02:25
卧底A接到消息,行动时间为:02:25
===========由于消息败露,行动时间提前=========
卧底B接到消息,行动时间为:01:05
卧底A接到消息,行动时间为:01:05
设计模式系列目录:
相关推荐
22.4.1 Java世界中的观察者模式 22.4.2 项目中真实观察者模式 22.4.3 订阅发布模型 22.5 最佳实践 第23章 门面模式 23.1 我要投递信件 23.2 门面模式的定义 23.3 门面模式的应用 23.3.1 门面模式的优点 23.3.2 门面...
5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...
5.7ObserverPattern(观察者模式) 236 5.7.1定义 236 5.7.2现实例子——拉登现身了 238 5.7.3C#实例——猫和老鼠 238 5.7.4C#实例——股票变化 241 5.7.5Java实例——监控系统 245 5.7.6优势和缺陷 248 ...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
综合实例——Bug管理系统 (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
pattern/src/behavior/observer //13.3观察者模式 pattern/src/behavior/iterator //13.4迭代子模式 pattern/src/behavior/chainofresponsibility//13.5责任链模式 pattern/src/behavior/command //13.6命令模式 ...
031114_【第11章:Java常用类库】_观察者设计模式笔记.pdf 031115_【第11章:Java常用类库】_正则表达式笔记.pdf 031116_【第11章:Java常用类库】_定时调度笔记.pdf 031201_【第12章:JAVA IO】_File类笔记.pdf ...
动态调用对象的属性和方法——性能和灵活性兼备的方法 消除由try/catch语句带来的warning 微软的应试题完整版(附答案) 一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和...
4.5 观察多个比较运算的结果 54 4.6 循环 57 4.6.1 重复执行操作 57 4.6.2 终止循环 59 4.7 处理错误 62 4.8 本章小结 64 4.9 习题 65 第5章 函数 67 5.1 将程序放在单独的文件中 67 5.2 函数:在一个名称下聚集 ...
Webx也是如此 —— 它在某些方面有一些独到的设计,超越了同类框架。Webx有哪些优势呢? Webx的优势 成熟可靠性 这个优势主要是针对阿里巴巴及属下网站而言。因为Webx在阿里巴巴和淘宝用了很多年。对于这种超大...