观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有的观察者对象,使它们能够自动更新自己。
以订阅微信公众号为例:
用户在微信订阅了微信公众号后,会收到公众号的消息推送。如果用户取消了订阅,那么就不会再收到推送。
观察者订阅公众号后会监听公众号推送的消息,推送后观察者会收到更新。可以抽象出一个观察者接口:
/**
* 观察者抽象层
*/
public interface Observer {
void update(String obj);
}
用户实现观察者接口,收到消息后将消息打印:
/**
* 观察者实现
*/
public class UserObserver implements Observer {
private String name;
private String message;
public UserObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
readMessage();
}
private void readMessage() {
System.out.println(name + "收到一条消息:" + message);
}
}
被观察者提供订阅、取消订阅、发布消息、以及发布消息后通知观察者的功能:
/**
* 被观察者抽象层
*/
public interface Observable {
void addObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
// 发布消息
void pushMessage(String message);
}
定义一个公众号的被观察者,并实现Observable:
/**
* 被观察者
*/
public class WechatObservable implements Observable {
private final List<Observer> list = new ArrayList<>();
private String message;
@Override
public void addObserver(Observer observer) {
list.add(observer);
}
@Override
public void removeObserver(Observer observer) {
list.remove(observer);
}
@Override
public void notifyObservers() {
for (Observer observer : list) {
observer.update(message);
}
}
@Override
public void pushMessage(String message) {
this.message = message;
// 通知订阅的用户
notifyObservers();
}
}
public class ObserverTest {
public static void main(String[] args) {
WechatObservable wechatObservable = new WechatObservable();
UserObserver ryan = new UserObserver("Ryan");
UserObserver frank = new UserObserver("Mike");
wechatObservable.addObserver(ryan);
wechatObservable.addObserver(frank);
wechatObservable.pushMessage("第三次分配来了!实现共同富裕再放大招!");
}
}
打印结果:
Ryan收到一条消息:第三次分配来了!实现共同富裕再放大招!
Mike收到一条消息:第三次分配来了!实现共同富裕再放大招!