标签:
观察者模式是对象的行为模式,又叫做发布-订阅模式、源-监听器模式或者从属者模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听同一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
下面给出一个简单的示意性系统,在该系统中有如下几个角色:
/** * 抽象被观察者角色,抽象主题角色 */ public interface Subject { /* * 调用这个方法登记一个新的观察者对象 * */ public void attach(Observer observer); /* * 调用这个方法删除一个已经登记过的观察者对象 * */ public void detach(Observer observer); /* * 调用这个方法通知所有登记过的观察者对象 * */ void notifyObservers(); }
/** * 具体主题角色,具体被观察者角色 */ public class ConcreteSubject implements Subject { private Vector observersVector=new Vector(); /* * 调用这个方法登记一个新的观察者对象 * */ @Override public void attach(Observer observer) { observersVector.addElement(observer); } /* * 调用这个方法删除一个登记过的观察者对象 * */ @Override public void detach(Observer observer) { observersVector.removeElement(observer); } /* * 调用这个方法通知所有登记过的观察者对象 * */ @Override public void notifyObservers() { Enumeration enumeration=observers(); while(enumeration.hasMoreElements()) { Observer observer=(Observer)enumeration.nextElement(); observer.update(); } } /* * 这个方法给出观察者聚集的Enumeration对象 * */ public Enumeration observers() { return ((Vector)observersVector.clone()).elements(); } }
/** * 抽象观察者角色 */ public interface Observer { /* * 调用这个方法会更新自己 * */ void update(); }
/** * 具体观察者 */ public class ConcreteObserver implements Observer { /* * 调用这个方法会更新自己 * */ private String observerName; public ConcreteObserver(String name) { this.observerName=name; } public String getObserverName() { return observerName; } @Override public void update() { System.out.println(observerName+" I am notified"); } }
另外一种实现:
/** * 抽象主题角色 */ public abstract class Subject { private Vector observersVector=new 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() { Enumeration enumeration=observers(); while(enumeration.hasMoreElements()) { Observer observer=(Observer)enumeration.nextElement(); observer.update(); } } /* * 这个方法给出观察者聚集的Enumeration对象 * */ public Enumeration observers() { return ((Vector) observersVector.clone()).elements(); } } /** * 具体主题角色 */ public class ConcreteSubject extends Subject { private String state; /* * 调用这个方法更改主题的状态 * */ public void change(String newState) { this.state=newState; System.out.println("状态改变"); this.notifyObservers();; } } /** * 抽象观察者角色 */ public interface Observer { /* * 调用这个方法会更新自己 * */ void update(); } /** * 具体观察者 */ public class ConcreteObserver implements Observer { /* * 调用这个方法会更新自己 * */ private String observerName; public ConcreteObserver(String name) { this.observerName=name; } public String getObserverName() { return observerName; } @Override public void update() { System.out.println(observerName+" I am notified"); } } public class Client { public static void main(String[] args) { ConcreteObserver concreteObserver1=new ConcreteObserver("observer1"); ConcreteObserver concreteObserver2=new ConcreteObserver("observer2"); ConcreteObserver concreteObserver3=new ConcreteObserver("observer3"); ConcreteSubject subject=new ConcreteSubject(); subject.attach(concreteObserver1); subject.attach(concreteObserver2); subject.attach(concreteObserver3); subject.change("new_state"); } }
标签:
原文地址:http://www.cnblogs.com/xtsylc/p/4761528.html