观察者模式概念
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
应用场景
- 日志记录器:用户可以选择日志存储到什么地方
- 数据库访问:用户可以选择数据库
- 设计一个连接服务器的框架
实现案例
- 创建 Subject 类。 ``` java public class Subject {
private List
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(); } } }
1
2
3
4
5
6
- 创建 Observer 类。
``` java
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
- 创建实体观察者类。
1 2 3 4 5 6 7 8 9 10 11 12 13
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() ) ); } }
- OctalObserver类:
1 2 3 4 5 6 7 8 9 10 11 12 13
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() ) ); } }
- HexaObserver类:
1 2 3 4 5 6 7 8 9 10 11 12 13
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() ); } }
- 使用 Subject 和实体观察者对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
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); } }