定义
观察者模式定义了对象之间的一对多依赖关系,当一个对象改变时,它所有的依赖对象都会收到通知并自动更新
类图
Subject是主题接口,定义了订阅、取消订阅、通知更新等方法
CurrentSubject是具体的主题实现类,实现的Subject接口的订阅、取消、通知更新方法,还包含一个存储观察者的list
Observer是观察者接口,只有一个update方法
UserObserver是观察者的具体实现,实现的Observer接口
适用场景
观察者适用于订阅-发布模式的业务场景,比如,微信公众号就是一个典型的观察者业务场景模式,每个公众号就是一个主题,用户就是观察者,用户订阅公众号后,公众号发布更新后会通知到每一个用户
代码
主题接口:
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObserver();
}
观察者接口:
public interface Observer {
public void update(String message);
}
主题具体实现:
public class CurrentSubject implements Subject {
private List<Observer> observers;
private String message;
public CurrentSubject(){
observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
if(observers != null && observers.size() > 0){
observers.remove(observer);
}
}
@Override
public void notifyObserver() {
if(observers != null && observers.size() > 0){
for (Observer o: observers) {
o.update(message);
}
}
}
public void publishMessage(String message){
this.message = message;
notifyObserver();
}
}
观察者具体实现:
public class UserObserver implements Observer {
private String userName;
public UserObserver(String userName){
this.userName = userName;
}
@Override
public void update(String message) {
System.out.println(userName + ":" + message);
}
}
测试类:
public class Test {
public static void main(String[] args){
//创建一个主题
CurrentSubject subject = new CurrentSubject();
//创建三个观察者
UserObserver userZhang = new UserObserver("Mr Zhang");
UserObserver userZhao = new UserObserver("Mr Zhao");
UserObserver userLiu = new UserObserver("Mr Liu");
//订阅
subject.registerObserver(userZhang);
subject.registerObserver(userZhao);
subject.registerObserver(userLiu);
subject.publishMessage("我有变更了,请各位观察者收消息啦!!!");
//取消订阅
subject.removeObserver(userZhao);
subject.publishMessage("我又有变更啦!!!");
}
}
运行结果如下:
Mr Zhang:我有变更了,请各位观察者收消息啦!!!
Mr Zhao:我有变更了,请各位观察者收消息啦!!!
Mr Liu:我有变更了,请各位观察者收消息啦!!!
Mr Zhang:我又有变更啦!!!
Mr Liu:我又有变更啦!!!
以上运行结果可以看出,订阅了主题的观察者,在主题发生变更时,所有的观察者都会收到通知并进行更新操作
取消订阅的观察者不会收到通知
观察者模式以松耦合的方式在一系列对象之间沟通状态,我们可以自定义各种主题,也可以任意进行订阅主题,主题与观察者实现解耦合。