一、定义
观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题对象,这个主题对象在状态发生变化时会通知所有观察者对象,使他们能够更新自己。
二、框架运用
现实中我们监听MQ消息并消费的模式使用的就是观察者模式
三、实战
1、观察者
public interface Observer {
void update();
}
public class ConcreteObserver implements Observer {
private String name;
private String state;
private ConcreteSubject concreteSubject;
public ConcreteObserver( ConcreteSubject concreteSubject,String name) {
this.concreteSubject = concreteSubject;
this.name = name;
}
@Override
public void update() {
state = concreteSubject.getState();
System.out.println("观察者"+name+"的新状态是"+state);
}
}
2、通知者
public abstract class Subject {
private List<Observer> observers = new ArrayList<>();
public void Attach(Observer observer){
observers.add(observer);
}
public void Detach(Observer observer){
observers.remove(observer);
}
public void notifyObserver(){
observers.forEach(Observer::update);
}
}
public class ConcreteSubject extends Subject {
private String state;
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
3、执行类
public class Client {
public static void main(String[] args) {
ConcreteSubject concreteSubject = new ConcreteSubject();
concreteSubject.Attach(new ConcreteObserver(concreteSubject,"A"));
concreteSubject.Attach(new ConcreteObserver(concreteSubject,"B"));
concreteSubject.Attach(new ConcreteObserver(concreteSubject,"C"));
concreteSubject.setState("停止");
concreteSubject.notifyObserver();
}
}
4、结果
Connected to the target VM, address: '127.0.0.1:54539', transport: 'socket'
观察者A的新状态是停止
观察者B的新状态是停止
观察者C的新状态是停止
Disconnected from the target VM, address: '127.0.0.1:54539', transport: 'socket'