1. 程式人生 > >觀察者模式:以微信公眾服務為例

觀察者模式:以微信公眾服務為例

wrap span lis vat nts 1.2 對象 user 兩個

1. 觀察者模式

觀察者模式屬於設計模式中的行為型模式,主要用於對象間存在一對多的關系的時候。
  • 作用:在一對多的對象關系中,當主對象的狀態發生改變時,所有依賴於它的對象都將會被自動更新並得到通知。
  • 解決的問題:向其它對象通知主對象的改變。
  • 何時使用:當主對象的狀態發生改變時,所有依賴於它的對象都將得到通知。
  • 使用場景:
    • 一個抽象模型有兩個方面,其中一個方面依賴於另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復用。
    • 一個對象的改變將導致其他一個或多個對象也發生改變,而不知道具體有多少對象將發生改變,可以降低對象之間的耦合度。
    • 一個對象必須通知其他對象,而並不知道這些對象是誰。
    • 需要在系統中創建一個觸發鏈,A對象的行為將影響B對象,B對象的行為將影響C對象……,可以使用觀察者模式創建一種鏈式觸發機制。
2.在微信公眾服務中的實現示例 subject.java 主對象接口
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. 觀察者模式的優點和缺點
  • 優點:
    • 觀察者與被觀察者之間沒有緊密耦合,主對象只知道一個觀察者列表,並不知道任何一個觀察者
    • 當主對象的數據改變時,會對觀察者發出通知,觀察者的數據也隨之改變
  • 缺點:
    • 如果一個主對象的觀察者有很多,通知觀察者會耗費大量的時間
    • 如果主對象和觀察者之間存在循環依賴,會導致系統崩潰
    • 觀察者不知道主對象是如何變化的,只知道主對象發生了變化
本文所引用的github地址:https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/observer

觀察者模式:以微信公眾服務為例