Design pattern–观察者模式
什么是观察者模式
观察者模式:是对象的行为模式,又叫发布-订阅(Publish-Subscribe)模式,模型-视图(Model-View)模式或源-监听(Source-Listener)模式。
观察者模式定义一种一对多的依赖关系,让多个观察者同时监听一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够更新自己。
看个例子,假设爱奇艺客户端是一个主题,当有电视剧更新的时候,vip用户能够第一时间收到通知,这里就需要使用观察者模式来实现。
// Observer.java
public interface Observer {
void update(String state);
}
// VIPObserver.java
public class VIPObserver implements Observer{
public String userName;
public VIPObserver(String userName) {
this.userName = userName;
}
@Override public void update(String state) {
System.out.println(userName + "收到一条消息,电视剧" + state + "更新了!!");
}
}
观察者(VIPObserver)中的update方法正是主题(IqiyiSubject)在变更的时候调用的,下面看下主题的实现
// Subject.java
public abstract class Subject {
public ArrayList<Observer> observers = new ArrayList<>();
public void attach(Observer observer) {
observers.add(observer);
}
public void dettach(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String state) {
for (Observer observer : observers) {
observer.update(state);
}
}
public abstract void change(String state);
}
// IqiyiSubject.java
public class IqiyiSubject extends Subject{
@Override public void change(String state) {
notifyObservers(state);
}
}
主题(IqiyiSubject)和观察者(VIPObserver)都定义完成了,接下来调用一下
Subject subject = new IqiyiSubject();
Observer observerA = new VIPObserver("杨幂");
Observer observerB = new VIPObserver("范冰冰");
subject.attach(observerA);
subject.attach(observerB);
subject.change("【择天记】");
运行结果:
04-29 12:04:11.209 26961-26961/com.testdes.des I/System.out: 杨幂收到一条消息,电视剧【择天记】更新了!!
04-29 12:04:11.209 26961-26961/com.testdes.des I/System.out: 范冰冰收到一条消息,电视剧【择天记】更新了!!