主要作用:
当对象间存在一对多的关系时,当一个对象状态变化时,通知依赖它的对象
一、本质理解
说明:
所谓观察者模式是一个类的状态的变化,可以被其他类检测到,并作出相应的变化
类图如下:

类说明:定义一个抽象的方法,用于对被观察者的类的状态作出反应
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
所有的观察者收到被观察者的变化