1 概述
观察者模式,也叫发布订阅模式。
主要用于 1 : N 的通知中。当一个对象(目标对象 Subject 或者 Objservable )的状态变化时,他需要及时告知一系列的对象(观察者对象,Observer),令他们做出响应。
2 结构图
3 demo
3.1 demo1
public interface Subject {// 抽象事件源
public void registerObserve(Observer observer);
public void removeObserve(Observer observer);
public void notifyObserve();
}
public interface Observer {// 抽象观察者
public void update(String message);
}
public class ConcreteSubject implements Subject {
private List<Observer> observerList;//观察者
private String message;//观察的事件
public ConcreteSubject(){
observerList = new ArrayList<>();
}
@Override
public void registerObserve(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserve(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObserve() {//采用推送的形式通知观察者
for (Observer o:observerList){
o.update(message);
}
}
public void setInfomation(String s){
this.message=s;
System.out.println("发布更新消息"+s);
notifyObserve();
}
}
public class ConcreteObserver implements Observer {//具体的观察者
private String message;// 观察的事件
private String name;
public ConcreteObserver(String name){
this.name=name;
}
@Override
public void update(String message) {
this.message= message;
read();
}
public void read(){
System.out.println(name+"收到:"+message);
}
}
3.2 demo2
<1> 我们定义被观察对象
<2> 给出监听接口,具体的观察者都去实现这个接口,具体的观察者复写接口的方法,当被观察对象的状态发生变化,做出响应
<3> 定义具体的观察者
<4> 定义事件类Event,将观察者状态的改变封装成Event类,不同的状态对应不同的事件。
<5> 可以在Event中采用推送的形式使所有观察者都给出响应
观察者模式demo2
5 应用场景
- 聊天室程序的,服务器转发给所有客户端
- 网络游戏(多人联机对战)场景中,服务器将客户端的状态进行分发
- 邮件订阅
- Servlet 中,监听器Listener的实现
- Android 中,广播机制