当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
观察者模式
使用场景
对象间存在一对多关系时,可以使用观察者模式。
当一个对象被修改时,可以通知依赖于它的其他对象。
举个栗子
- 拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价
注意事项
- Java中已经含有对观察者模式的支持类s
- 避免循环引用
- 如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式
实现
被观察类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| 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(); } } }
|
观察接口
1 2 3 4 5
| 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())); } }
|
测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class ObserverTest {
@Test public void test(){ Subject subject = new Subject();
new BinaryObserver(subject); new OctalObserver (subject); new HexaObserver(subject);
System.out.println("First state change: 15"); subject.setState(15);
System.out.println("Second state change: 10"); subject.setState(10); } }
|