设计模式-观察者模式,介绍观察者模式,及代码实现。
简介
观察者模式又叫做发布-订阅模式,定义了一种一对多的依赖关系,让多个观察者对象(订阅者)同时监听某一个主题对象(发布者),这个主题对象在状态发生变化时,会通知所有观察对象,使它们能够自动更新自己。
模式特点
- 当一个对象的改变需要同时改变其他对象时,可以使用观察者模式。
- 观察者模式所做的工作就是在接触耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不影响另一边的变化。
角色
- 抽象观察者:为所有的具体观察者定义了一个接口,在得到主题的通知时更新自己。
- 抽象主题者:它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
- 具体主题:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。
- 具体观察者,实现抽象观察者角色要求的更新接口,一边使本身的状态与主题的状态相协调。
代码实现
抽象观察者
1 2 3 4 5 6 7 8 9
|
public abstract class Observer {
public abstract void update(); }
|
具体观察者
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
|
public class ConcreteObserver extends Observer {
private String name; private String observerState; private ConcreteSubject concreteSubject;
public ConcreteObserver(ConcreteSubject concreteSubject, String name) { this.setName(name); this.setConcreteSubject(concreteSubject); }
@Override public void update() { this.setObserverState(concreteSubject.getSubjectState()); System.out.println("观察者" + this.getName() + "的新状态是" + this.getObserverState()); }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getObserverState() { return observerState; }
public void setObserverState(String observerState) { this.observerState = observerState; }
public ConcreteSubject getConcreteSubject() { return concreteSubject; }
public void setConcreteSubject(ConcreteSubject concreteSubject) { this.concreteSubject = concreteSubject; }
}
|
抽象通知者
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 27 28 29 30 31 32 33 34
|
public abstract class Subject { private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer) { observers.add(observer); }
public void detach(Observer observer) { observers.remove(observer); }
public void notifyObserver() { for (Observer observer : observers) { observer.update(); } } }
|
具体通知者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public class ConcreteSubject extends Subject { private String subjectState;
public String getSubjectState() { return subjectState; }
public void setSubjectState(String subjectState) { this.subjectState = subjectState; } }
|
客户端调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public class ObserverClient {
public static void main(String[] args) { ConcreteSubject concreteSubject = new ConcreteSubject();
concreteSubject.attach(new ConcreteObserver(concreteSubject, "X")); concreteSubject.attach(new ConcreteObserver(concreteSubject, "Y")); concreteSubject.attach(new ConcreteObserver(concreteSubject, "Z"));
concreteSubject.setSubjectState("ABC"); concreteSubject.notifyObserver();
}
}
|