主要作用:
当对象间存在一对多的关系时,当一个对象状态变化时,通知依赖它的对象
一、本质理解
说明:
所谓观察者模式是一个类的状态的变化,可以被其他类检测到,并作出相应的变化
类图如下:
类说明:定义一个抽象的方法,用于对被观察者的类的状态作出反应
public abstract class Observer { protected Subject subject; public abstract void update(); }
定义具体的类,实现抽象方法,并在构造方法中加到被通知的集合中
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() ) ); } }
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() ) ); } }
定义观察者类,有以下属性,定义一个集合用于存放所有的观察者
定义一个状态用于通知所有的观察者,被观察者的状态
当被观察者的状态变化时,进行通知被观察者
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){ this.observers.add(observer); } public void notifyAllObservers(){ for (Observer observer : observers) { observer.update(); } } }
示例:
public class ObserverPatternDemo { public static void main(String[] args) { Subject subject = new Subject(); new OctalObserver(subject); new BinaryObserver(subject); subject.setState(1); } }
输出结果:
Octal String: 1 Binary String: 1
所有的观察者收到被观察者的变化