JAVA设计模式学习19——观察者模式
我们这里简单用代码描述如下:
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
设计模式系列目录: