一、什么是观察者模式
观察者模式又叫做发布-订阅(Publish/Subscribe)模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
二、观察者模式角色
1、Subject:叫做主题或抽象通知者,一般用一个抽象类或接口实现。它把所有对观察者对象保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
2、ConcreteSubject:叫做具体主题或具体通知者,将有关状态存入具体观察者对象;在具体主题的内部状态改变时,将所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
3、Observer:抽象观察者,为所有的具体观察者定义一个接口,在得到主题通知时更新自己。这个接口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口实现。更新接口通常包含一个update()方法。
4、ConcreteObserver:具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。具体观察者角色可以保存一个具体主题对象的引用。具体观察者角色通常用一个具体子类实现。
三、观察者模式类图
四、观察者模式代码
1、Subject
//主题
public abstract class Subject {
//观察者的存储集合
private List<Observer> observers = new ArrayList<>();
// 注册观察者方法
public void addObserver(Observer observer){
observers.add(observer);
}
// 删除观察者方法
public void deleteObserver(Observer observer){
observers.remove(observer);
}
//通知所有观察者更新
public void notifyObserver(){
observers.forEach(Observer::update);
}
}
2、Observer
//观察者
public abstract class Observer {
//更新观察者
public abstract void update();
}
3、ConcreteSubject
public class ConcreteSubject extends Subject {
//状态
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
//通知所有观察者
this.notifyObserver();
}
}
4、ConcreteObserver
public class ConcreteObserver extends Observer {
@Override
public void update() {
System.out.println("subject状态改变了,执行XX业务...");
}
}
5、客户端
public class MainClass {
public static void main(String[] args) {
Observer observer = new ConcreteObserver();
ConcreteSubject subject = new ConcreteSubject();
subject.addObserver(observer);
subject.setState("Update");
}
}
Java种提供了观察者模式的实现java.util.Observable、java.util.Observer,有兴趣的可以看看。