【設計模式】最常用的設計模式之一的觀察者模式

Colin_Mindset發表於2018-07-19

這裡寫圖片描述
以下是之前做的“產品詳情頁”的長截圖,這裡講解一下這個頁面與“觀察者模式”的關係:在活動季,底部的“開始預訂按鈕”會變成“秒殺按鈕”(所謂秒殺按鈕,就是一個顯示成灰色不可點選,並且一直處於倒數計時狀態的按鈕,直到到達秒殺時間,比如0點整,秒殺按鈕才由灰色變為橘黃色,並且可以點選), 當秒殺時間到時,不光底部的“秒殺按鈕”變為“開始預訂按鈕”,可選班期的幾個按鈕也從灰色不可點選狀態,變為白色可點選狀態。相信熟悉設計模式的人已經想到這就是“觀察者模式”。
【設計模式】最常用的設計模式之一的觀察者模式
觀察者模式,應該是很多人學設計模式時,學的第一個設計模式吧>
最近在研究redux原始碼時,也看到了觀察者模式,想來這個這麼常用的設計模式我還沒有寫過文章介紹,並且對於這個設計模式我還是有一定心得的,於是就有了這篇文章。。

一. 觀察者模式簡介

1. 定義

觀察者模式:定義物件間一種一對多的依賴關係,使得每當一個物件改變狀態,則所有依賴它的物件都會得到通知並自動更新

2. 意義

此設計模式最重要的作用就是 解耦!將觀察者與被觀察者解耦,使得他們之間的依賴性更小。
###3. UML圖
這裡寫圖片描述

  • Subject:就是“被觀察”的角色,它將所有觀察者物件的引用儲存在一個集合中。
  • Observer:是抽象的“觀察”角色,它定義了一個更新介面,使得在被觀察者狀態發生改變時通知自己。
  • ConcreteObserver:具體的觀察者。

二. 觀察者模式實現

以上理論相信大家並不模式,現在我們來應用到實際中。

1. 被觀察者Subject物件

首先是一個Subject類的父類,它實現了維護裝有觀察者引用集合的功能。

public class Subject {
    //儲存註冊的觀察者物件
    private List<Observer> mObervers = new ArrayList<>();

    //註冊觀察者物件
    public void attach(Observer observer) {
        mObervers.add(observer);
        Log.e("SZH", "attach an observer");
    }

    //登出觀察者物件
    public void detach(Observer observer) {
        mObervers.remove(observer);
        Log.e("SZH", "detach an observer");
    }

    //通知所有註冊的觀察者物件
    public void notifyEveryOne(String newState) {
        for (Observer observer : mObervers) {
            observer.update(newState);
        }
    }
}

接著是一個具體的被觀察者物件

public class ConcreteSubject extends Subject {
    private String state;

    public String getState() {
        return state;
    }

    public void change(String newState) {
        state = newState;
        Log.e("SZH", "concreteSubject state:" + newState);

        //狀態發生改變,通知觀察者
        notifyEveryOne(newState);
    }
}

2. 觀察者Observer物件

首先是一個介面,抽象出了一個及時更新的方法

public interface Observer {
    void update(String newState);
}

接著是幾個觀察者物件。

public class ObserverA implements Observer {

    //觀察者狀態
    private String observerState;

    @Override
    public void update(String newState) {
        //更新觀察者狀態,讓它與目標狀態一致
        observerState = newState;
        Log.e("SZH", "接收到訊息:" + newState + ";我是A模組,快來搶吧!!");
    }
}

public class ObserverB implements Observer {
    //觀察者狀態
    private String observerState;

    @Override
    public void update(String newState) {
        //更新觀察者狀態,讓它與目標狀態一致
        observerState = newState;
        Log.e("SZH", "接收到訊息:" + newState + ";我是B模組,快來搶吧!!");
    }
}

public class ObserverC implements Observer {
    //觀察者狀態
    private String observerState;

    @Override
    public void update(String newState) {
        //更新觀察者狀態,讓它與目標狀態一致
        observerState = newState;
        Log.e("SZH", "接收到訊息:" + newState + ";我是C模組,快來搶吧!!");
    }
}

為了讓大家更好的理解,以上uml圖可以通過下面這個圖更好地記憶。
這裡寫圖片描述

三. 最後

以上設計模式的程式碼都已經整合到demo中,歡迎下載檢視。
該demo會陸續整合各種設計模式,歡迎關注。

參考

https://blog.csdn.net/itermeng/article/details/52595691
https://my.oschina.net/122612475/blog/834686
https://www.cnblogs.com/mythou/p/3370340.html

相關文章