觀察者模式(又被稱為發布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態變化時,會通知所有的觀察者對象,使他們能夠自動更新自己。

舉個例子,比如某個品牌的車由于某種故障需要召回,這時4S電發出通知,所有符合召回條件的車,接收到通知去4S點,把故障修復掉。
首先要有個抽象的觀察者,負責觀察這件事
public interface Observer { public void updateCar(String message);}所有的車主,都是觀察者
public class Owner implements Observer { PRivate String ownerName; public Owner(String ownerName) { this.ownerName = ownerName; } @Override public void updateCar(String message) { System.out.println(ownerName + "-" + message); }}要有個4s店的抽象類,類里面方法有添加車主,刪除車主,和發通知
public interface Stores_4s { /** * 增加訂閱者 * @param observer */ public void attach(Observer observer); /** * 刪除訂閱者 * @param observer */ public void detach(Observer observer); /** * 通知訂閱者更新消息 */ public void notify(String message);}創建一個東風4S店
public class DFStores implements Stores_4s { private List<Observer> ownerList = new ArrayList<Observer>(); @Override public void attach(Observer observer) { ownerList.add(observer); } @Override public void detach(Observer observer) { ownerList.remove(observer); } @Override public void notify(String message) { for (Observer observer: ownerList) { observer.updateCar(message); } } public static void main(String[] args) { Stores_4s stores = new DFStores(); Owner owner = new Owner("張三"); Owner owner1 = new Owner("李四"); Owner owner2 = new Owner("王五"); stores.attach(owner); stores.attach(owner1); stores.attach(owner2); stores.notify("發動機故障,需要召回換發動機。"); }}優點當然就是解耦了,讓耦合的雙方都依賴于抽象,從而使得各自的變換都不會影響另一邊的變換。
如果觀察者比較多,或者其中一個觀察者執行時間比較長,就會導致整個程序比較慢,現在大多數情況下,都是采用MQ的異步消息通知機制。常用的MQ有,RabbitMq、ActiveMq、ZeroMq、kafka。還有阿里的RocketMQ,已經捐獻給了apache,還在孵化階段。
新聞熱點
疑難解答