一,概述
观察者模式定义了一种一对多的依赖关系,一个或多个观察者对象监听一个主题对象,被观察者维护了一个观察者集合,当主题发生变化,观察者对象自动更新。典型应用就是微信的发布订阅模式。
二,UML类图
三,代码实例
观察者接口
public interface Observer {
void update();
}
主题接口
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObserver();
}
具体观察者接口
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update() {
System.out.println(this.name+"收到推送信息");
}
}
public class Wechat implements Subject {
List<Observer> observerList = new ArrayList<>();
@Override
public void attach(Observer observer) {
observerList.add(observer);
}
@Override
public void detach(Observer observer) {
if(observerList.contains(observer)){
observerList.remove(observer);
}
}
@Override
public void notifyObserver() {
for(Observer observer : observerList){
observer.update();
}
}
public void setMessage(String message){
System.out.println("微信更新消息"+message);
notifyObserver();
}
}
客户端
public class Test {
public static void main(String[] args) {
Wechat server = new Wechat();
Observer userZhang = new ConcreteObserver("ZhangSan");
Observer userLi = new ConcreteObserver("LiSi");
Observer userWang = new ConcreteObserver("WangWu");
server.attach(userLi);
server.attach(userZhang);
server.attach(userWang);
server.setMessage("啦啦");
server.detach(userZhang);
server.setMessage("11");
}
}
微信更新消息啦啦
LiSi收到推送信息
ZhangSan收到推送信息
WangWu收到推送信息
微信更新消息11
LiSi收到推送信息
WangWu收到推送信息