前言設計模式
觀察者,即時observer,總結來講就是一個當一個被觀察的對象的狀態發生變化時,會通知相應的觀察者對象。ide
觀察者模式定義了四種角色:抽象主題、具體主題、抽象觀察者、具體觀察者測試
1.抽象主題(Subject):一般爲接口或抽象類,定義一系列操做,如訂閱,取消訂閱,通知等方法spa
2.具體主題(Concrete Subject):具體主題,繼承或實現抽象主題,實現相應的邏輯,如維護與觀察者的關係,將自身的狀態變化告知觀察者。設計
3.抽象觀察者(Observer):定義觀察者行爲code
4.具體觀察者(Concrete Observer):實現觀察者行爲,實現收到被觀察者的通知後將要處理的邏輯server
舉個例子,Lz比較喜歡看雜誌,因此訂閱了「意林」雜誌的公衆號,此時我就是觀察者,而「意林」雜誌的公衆號則是被觀察者,當新一期的雜誌出版時,即被觀察者有狀態變化,公衆號就會給我推送通知。對象
因此說公衆號是具體主題,而我是具體觀察者,咱們之間的關係是由公衆號一方來維護的。blog
代碼演示:繼承
//抽象觀察者 interface Observer{ public void update(String message); }
//具體觀察者 class MyWeixin implements Observer{ @Override public void update(String message) { System.out.println("我收到的通知: " + message); } }
//抽象主題 interface Subject{ //訂閱 public void registerObserver(Observer observer); //取消訂閱 public void unregisterObserver(Observer observer); //通知 public void notifyObserver(String message); }
//具體主題,實現一系列邏輯操做,維護與觀察者的關係 class YLi implements Subject{ //維護與觀察者的關係 private List<Observer> relationList = new ArrayList<>(); @Override public void registerObserver(Observer observer) { relationList.add(observer); } @Override public void unregisterObserver(Observer observer) { relationList.remove(observer); } @Override public void notifyObserver(String message) { for (int i=0; i < relationList.size(); i++){ Observer observer = relationList.get(i); observer.update(message); } } }
測試代碼:
public class ObserverPatternTest { public static void main(String[] args){ Observer observer = new MyWeixin(); Subject subject = new YLi(); subject.registerObserver(observer); subject.notifyObserver("新的一期意林雜誌出版了!"); subject.unregisterObserver(observer); } }
控制檯打印
總結:觀察者模式在有的書裏又稱爲發佈/訂閱模式,當須要對某個對象的狀態進行檢測時,則能夠使用該設計模式。例如觀察檢測溫度超過某閾值時,向APP推送短信提醒。
與MQTT協議的話題訂閱推送實際上是相似的,基本流程都是先訂閱維護一個關係,在有狀態變化時則給相應的觀察者推送數據,惟一不一樣的是觀察與被觀察的關係是由誰來維護。