观察者(Observer)模式【行为模式第七篇】
观察者(Observer)模式
观察者模式是对象的行为模式,又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、
源-监听器(Source/Listener)模式或从属者(Dependents)模式。
观察者模式定义了一种一对多的依赖关系,许多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,
会通知所有观察者对象,使它们能够自动更新自己。657P
一、观察者模式有以下几种结构:
1、抽象主题(Subject)角色:主题角色把所有对观察者对象的引用保存在一个聚集(比如Vector对象)里,每个主题都可以有任何
数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色。
2、抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。抽象
观察者角色一般用一个抽象观察者角色一般用一个抽象或者一个接口实现,其中的方法叫做更新方法。
3、具体主题(ConcreteSubject)角色:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出
通知。具体主题角色又叫做具体被观察者角色(Concrete Observerable)。具体主题角色通常用一个具体子类实现,具体主题角色
负责实现对观察者引用的聚集的管理方法。
4、具体观察者角色:存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与
主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题对象的引用。具体观察者角色通常用一个具体子类实现。
第一种实现:由具体主题角色关联到抽象观察者角色 //抽象主题public interface Subject{//d调用这个方法登记一个新的观察者对象public void attach(Observer observer);//调用这个方法删除一个已经登记过的观察者对象public void detach(Observer observer);//调用这个方法通知所有登记过的观察者对象void notifyObservers();} //具体主题角色import java.util.Vector;import java.util.Enumeration;public class ConcreteSubject implements Subject{private Vector observersVector = new Vector();public void attach(Observer observer){observersVector.addElement(observer);}public void detach(Observer observer){observersVector.removeElement(observer);}public void notifyObservers(){Enumeration enumeration = observers();while(enumeration.hasMoreElements()){((Observer)enumeration.nextElement()).update();}}//这个方法给出观察者聚集的Enumeration对象public Enumeration observers(){return ((Vector)observersVector.clone()).elements();}} //抽象观察者public interface Observer{void update();}public class ConcreteObserver implements Observer{public void update(){System.out.println("I am notified");}}//第二种实现:由抽象主题角色代表出观察者对象的聚集连线到抽象观察者//抽象主题import java.util.Vector;import java.util.Enumeration;public abstract class Subject{private Vector observersVector = new Vector();public void attach(Observer observer){observersVector.addElement(observer);System.out.println("Attach an observer.");}public void detach(Observer observer){observersVector.removeElement(observer);}public void notifyObservers(){Enumeration enumeration = observers();while(enumeration.hasMoreElement()){((Observer)enumeration.nextElement()).update();}}public Enumeration observers(){return ((Vector)observersVector.clone()).elements();}}//具体主题public class ConcreteSubject extends Subject{private String state;public void change(String newState){state = newState;this.notifyObservers();}}/...................//客户端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");}}