观察者模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式,是一种行为型设计模式。
观察者模式的思想是:定义一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式涉及4个角色:
- 抽象主题(Subject):被观察者的抽象。持有一个保存观察者的集合,拥有添加观察者、删除观察者和通知观察者的方法。
- 具体主题(Concrete Subject):具体的被观察者,继承自抽象主题,当发生某个行为或属性发生改变时通知观察者。
- 抽象观察者(Observer):观察者的抽象。
- 具体观察者(Concrete Observer):具体的观察者,持有一个回调方法,当被观察的主题发生变化时,就是通过这个回调方法来触发观察者的行为。
结构图:
具体代码实现:
观察者:
public interface Observer {
void update(String newState); // 改变自身状态的方法
}
public class ConcreteObserverA implements Observer {
@Override
public void update(String newState) {
System.out.printf("state of Observer A now is: %s\n", newState);
}
}
public class ConcreteObserverB implements Observer {
@Override
public void update(String newState) {
System.out.printf("state of Observer B now is: %s\n", newState);
}
}
主题(被观察者):
public class Subject {
// 持有一个保存观察者的集合
private List<Observer> list = new ArrayList<>();
// 添加观察者
public void attach(Observer observer) {
list.add(observer);
}
// 删除观察者
public void detach(Observer observer) {
list.remove(observer);
}
// 通知列表中的所有观察者
protected void notifyObservers(String newState) {
for (Observer observer : list) {
observer.update(newState);
}
}
}
public class ConcreteSubject extends Subject {
// 一个改变被观察者状态的方法
public void change(String newState) {
System.out.printf("state of Subject now is: %s\n", newState);
notifyObservers(newState); // 改变的同时通知列表中的所有观察者
}
}
测试:
public class ObserverTest {
public static void main(String[] args) {
Observer o1 =