1.观察者模式简介
当对象间存在一对多关系时,则可使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者
模式属于行为型模式。
使用场景:
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
注意:目前java中已经有对观察者进行支持的类。
2.实现Demo
观察者模式使用三个类 Subject、Observer 和 Client(ObserverPatternDemo)。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。
我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。
import java.util.List; import java.util.ArrayList; class Subject { private int state; private List<Observer> lists = new ArrayList<Observer>(); public int getState() { return state; } public void setState(int state) { this.state = state; notifyAllObservers(); } public void attach(Observer observer) { lists.add(observer); } public void notifyAllObservers() { for (Observer observer : lists) { observer.update(); } } } abstract class Observer { protected Subject subject; abstract public void update(); } 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())); } } 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())); } } class HexObserver extends Observer { public HexObserver(Subject subject) { this.subject = subject; this.subject.attach(this); } @Override public void update() { System.out.println("Hexa String: " + Integer.toHexString(subject.getState()).toUpperCase()); } } public class ObserverPatternDemo { public static void main(String args[]) { Subject subject = new Subject(); Observer binaryObserver = new BinaryObserver(subject); Observer octalObserver = new OctalObserver(subject); Observer hexObserver = new HexObserver(subject); subject.setState(10); subject.setState(20); } }
参考:http://www.runoob.com/design-pattern/observer-pattern.html