深刻理解Java設計模式之觀察者模式

前言設計模式

觀察者,即時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協議的話題訂閱推送實際上是相似的,基本流程都是先訂閱維護一個關係,在有狀態變化時則給相應的觀察者推送數據,惟一不一樣的是觀察與被觀察的關係是由誰來維護。

相關文章
相關標籤/搜索