1.簡介
簡單的來說就是一對多模式(即消息發(fā)布訂閱模式)窖认,一發(fā)生改變,多能夠收到改變的消息。典型的應(yīng)用就是消息隊列Kafka, MQ等系奉。
2.舉個簡單的小栗子
公眾號平臺和訂閱該公眾號的微信號桥言,就是典型的觀察者模式。公眾號有消息推送弯汰,各個關(guān)注微信號的人都能收到消息咏闪,下面是模式代碼纵装。
3.代碼實現(xiàn)
3.1 Subject.java可以理解為抽象公眾號主題
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyMsg();
}
3.2 Platform.java公眾號平臺
public class Platform implements Subject {
private List<Observer> observers = null;
public Platform() {
this.observers = new ArrayList<>();
}
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyMsg() {
observers.forEach(observer -> {
observer.update("push msg.");
});
}
}
3.3 Observer.java觀察者抽象接口
public interface Observer {
void update(String msg);
}
3.4 WeiXinUser.java具體
public class WeiXinUser implements Observer {
private String name;
public WeiXinUser(String name) {
this.name = name;
}
@Override
public void update(String msg) {
System.out.println("name:" + name + " MSG:" + msg);
}
}
4.測試
public class ObserverPatternDemo {
public static void main(String[] args) {
Platform platform = new Platform();
Observer tom = new WeiXinUser("tom");
WeiXinUser jack = new WeiXinUser("jack");
platform.attach(tom);
platform.attach(jack);
platform.notifyMsg();
platform.detach(jack);
platform.notifyMsg();
}
}
result:
name:tom MSG:push msg.
name:jack MSG:push msg.
name:tom MSG:push msg.
tom和jack開始都關(guān)注了公眾號桑逝,所以都能接收到消息推送巧骚。后來jack取消了长窄,那么只有tom能接收到推送了滔吠。