当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
观察者模式
使用场景
对象间存在一对多关系时,可以使用观察者模式。
当一个对象被修改时,可以通知依赖于它的其他对象。
举个栗子
- 拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价
注意事项
- Java中已经含有对观察者模式的支持类s
- 避免循环引用
- 如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式
实现
被观察类
| 12
 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();
 }
 }
 }
 
 | 
观察接口
| 12
 3
 4
 5
 
 | public abstract class Observer {protected Subject subject;
 public abstract void update();
 }
 
 
 | 
观察者实例
| 12
 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()));
 }
 }
 
 | 
测试
| 12
 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);
 }
 }
 
 |