Java观察者模式的浅析
简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。
在观察者模式里有如下的角色:
抽象主题(Subject)角色:
主题角色把所有的观察者对象的引用保存在一个列表里;每个主题都可以有任何数量的观察者。主题提供一个接口可以加上或撤销观察者对象;主题角色又叫做抽象被观察者(Observable)角色;
抽象观察者(Observer)角色:
为所有的具体观察者定义一个接口,在得到通知时更新自己;
具体主题(ConcreteSubject)角色:
保存对具体观察者对象有用的内部状态;在这种内部状态改变时给其观察者发出一个通知;具体主题角色又叫作具体被观察者角色
具体观察者(ConcreteObserver)角色:
保存一个指向具体主题对象的引用;和一个与主题的状态相符的状态。具体观察者角色实现抽象观察者角色所要求的更新自己的接口,以便使本身的状态与主题的状态自恰。
继承关系(此实例简化了abstract subject类):
代码实现:
(1)创建Subject类
package study_02.designpattern.observer; import java.util.ArrayList; import java.util.List; /** * Create <strong>Subject</strong> class. * @author WWX * */ public class Subject { private List<Observer> observers = new ArrayList<Observer>(); private int state; public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer){ observers.add(observer); } public void notifyAllObservers(){ for (Observer observer : observers) { observer.update(); } } }
(2)创建Oberver抽象类或接口
package study_02.designpattern.observer; /** * Create <strong>Observer</strong> class * @author WWX * */ public abstract class Observer { protected Subject subject; public abstract void update(); }
(3)创建继承了Oberver接口Concrete Oberver类
package study_02.designpattern.observer; /** * Create <strong>concrete observer</strong> classes * @author WWX * */ public class BinaryObserver extends Observer { public BinaryObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("Binary String: " + Integer.toBinaryString(subject.getState())); } }
package study_02.designpattern.observer; /** * Create <strong>concrete observer</strong> classes * @author WWX */ public class HexaObserver extends Observer { public HexaObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("Hex String: " + Integer.toHexString(subject.getState()).toUpperCase()); } }
package study_02.designpattern.observer; /** * Create <strong>concrete observer</strong> classes * @author WWX */ public class OctalObserver extends Observer { public OctalObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("Octal String: " + Integer.toOctalString(subject.getState())); } }
(4)使用Subject和Concrete Oberver对象
package study_02.designpattern.observer; /** * * @author WWX */ public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new Subject(); new HexaObserver(subject); new OctalObserver(subject); new BinaryObserver(subject); System.out.println("First state change: 15"); subject.setState(15); System.out.println("Second state change: 10"); subject.setState(10); } }