我们这里简单用代码描述如下:
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 门面...
以上就是Java设计模式的一些基本概念和应用,理解并熟练掌握这些模式对于编写高质量、易于维护的Java代码至关重要。通过阅读《设计模式——Java语言中的应用》这本书,你可以更深入地学习和掌握这些模式的细节及其在...
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 ...
7. **设计模式**:设计模式是解决软件开发中常见问题的最佳实践,例如单例模式、工厂模式、观察者模式、装饰器模式等。面试官通常期望候选人能灵活运用这些模式来解决问题。 8. **JVM**:了解Java虚拟机的工作原理...
8. **设计模式**:熟悉常见的设计模式,如单例、工厂、抽象工厂、建造者、装饰器、适配器、观察者、策略、模板方法、代理等。 9. **Spring框架**:理解依赖注入(DI)和控制反转(IOC),掌握AOP(面向切面编程)、...
17. **设计模式**:熟悉常见的设计模式,如单例模式、工厂模式、观察者模式等,它们是解决软件设计问题的通用方案。 18. **JVM内存管理**:理解JVM的内存结构,包括堆、栈、方法区、本地方法栈等,以及垃圾回收机制...
15. **设计模式**:介绍一些常见的设计模式,如工厂模式、单例模式、观察者模式等,提升代码质量。 四、.NET Framework与Windows应用 16. **.NET框架**:理解.NET框架的结构,学习System命名空间下的核心类库。 17....