觀察者模式:以微信公眾服務為例
阿新 • • 發佈:2018-10-24
wrap span lis vat nts 1.2 對象 user 兩個
1. 觀察者模式
觀察者模式屬於設計模式中的行為型模式,主要用於對象間存在一對多的關系的時候。- 作用:在一對多的對象關系中,當主對象的狀態發生改變時,所有依賴於它的對象都將會被自動更新並得到通知。
- 解決的問題:向其它對象通知主對象的改變。
- 何時使用:當主對象的狀態發生改變時,所有依賴於它的對象都將得到通知。
- 使用場景:
- 一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復用。
- 一個對象的改變將導致其他一個或多個對象也發生改變,而不知道具體有多少對象將發生改變,可以降低對象之間的耦合度。
- 一個對象必須通知其他對象,而並不知道這些對象是誰。
- 需要在系統中創建一個觸發鏈,A對象的行為將影響B對象,B對象的行為將影響C對象……,可以使用觀察者模式創建一種鏈式觸發機制。
package com.example.jingbin.designpattern.observer.interfaces; /** * Created by jingbin on 2016/10/21. * 專題接口,所有的主題必須實現此接口 */ public interface Subject { /** * 註冊一個觀察者 */ public void registerObserver(Observer observer); /** * 移除一個觀察者 */ public void removeObserver(Observer observer); /** * 通知所有觀察者 */ public void notifyObservers(); }
ObjectFor3D.java 實現主對象
package com.example.jingbin.designpattern.observer.classs; import com.example.jingbin.designpattern.observer.interfaces.Observer; import com.example.jingbin.designpattern.observer.interfaces.Subject; import java.util.ArrayList; /** * Created by jingbin on 2016/10/21. * 接下來3D服務號的實現類: */ public class ObjectFor3D implements Subject { private ArrayList<Observer> observers = new ArrayList<>(); /** * 3D 彩票的號碼 */ private String msg; @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int index = observers.indexOf(observer); if (index >= 0) { observers.remove(index); } } @Override public void notifyObservers() { for (Observer observer : observers) { observer.update(msg); } } /** * 主題更新信息 */ public void setMsg(String msg) { this.msg = msg; notifyObservers(); } }
Observer.java 觀察者接口
package com.example.jingbin.designpattern.observer.interfaces; /** * Created by jingbin on 2016/10/21. * 所有觀察者需要實現此接口 */ public interface Observer { public void update(String msg); }
ObserverUser1.java 第一個觀察者的實現
package com.example.jingbin.designpattern.observer.classs; import android.util.Log; import com.example.jingbin.designpattern.observer.interfaces.Observer; import com.example.jingbin.designpattern.observer.interfaces.Subject; /** * Created by jingbin on 2016/10/21. * 模擬第一個使用者 */ public class ObserverUser1 implements Observer { public ObserverUser1(Subject subject) { subject.registerObserver(this); } @Override public void update(String msg) { Log.e("-----ObserverUser1 ", "得到 3D 號碼:" + msg + ", 我要記下來。 "); // Toast.makeText(PatternApplication.getInstance(), "-----ObserverUser1 得到 3D 號碼:" + msg, Toast.LENGTH_SHORT).show(); } }
ObserverUser2.java 第二個觀察者的實現
package com.example.jingbin.designpattern.observer.classs; import android.util.Log; import com.example.jingbin.designpattern.observer.interfaces.Observer; import com.example.jingbin.designpattern.observer.interfaces.Subject; /** * Created by jingbin on 2016/10/21. * 模擬第二個使用者 */ public class ObserverUser2 implements Observer { public ObserverUser2(Subject subject) { subject.registerObserver(this); } @Override public void update(String msg) { Log.e("-----ObserverUser2 ", "得到 3D 號碼:" + msg + ", 我要告訴舍友們。"); // Toast.makeText(PatternApplication.getInstance(), "-----ObserverUser2 得到 3D 號碼:" + msg, Toast.LENGTH_SHORT).show(); } }
測試
// 創建服務號 objectFor3D = new ObjectFor3D(); // 創建兩個訂閱者 observerUser1 = new ObserverUser1(objectFor3D); observerUser2 = new ObserverUser2(objectFor3D); // 兩個觀察者,發送兩條信息 objectFor3D.setMsg("201610121 的3D號為:127"); objectFor3D.setMsg("20161022 的3D號為:000");
運行結果 如上所示,觀察者模式實現了當主對象改變時,其它對象都將會被自動更新 3. 觀察者模式的優點和缺點
- 優點:
- 觀察者與被觀察者之間沒有緊密耦合,主對象只知道一個觀察者列表,並不知道任何一個觀察者
- 當主對象的數據改變時,會對觀察者發出通知,觀察者的數據也隨之改變
- 缺點:
- 如果一個主對象的觀察者有很多,通知觀察者會耗費大量的時間
- 如果主對象和觀察者之間存在循環依賴,會導致系統崩潰
- 觀察者不知道主對象是如何變化的,只知道主對象發生了變化
觀察者模式:以微信公眾服務為例