1. 程式人生 > >Rx_java(1) 觀察者模式例項講解

Rx_java(1) 觀察者模式例項講解

相關文章

寫在前面

  • 通常我們的程式碼設計思想都是來源於生活,如面向物件的設計思想,觀察者模式等均來源現實生活。在我們正常接觸到的程式碼中,回撥介面、回撥函式、回撥引數、監聽器模式,這些也是觀察者模式。

  • 觀察者模式(Observer)將觀察者和被觀察的物件分離開。拿觀察者模式呢舉個例子,我們介面是一個觀察者,而介面上面顯示的資料是被觀察者,如果我們的資料一旦發生變化,我們的介面馬上把這些變化後的資料顯示出來。

  • 面向物件設計的一個原則是:系統中的每個類將重點放在某一個功能上,而不是其他方面。一個物件只做一件事情,並且將他做好。觀察者模式在模組之間劃定了清晰的界限,提高了應用程式的可維護性和重用性。
    觀察者設計模式定義了物件間的一種一對多的組合關係,以便一個物件的狀態發生變化時,所有依賴於它的物件都得到通知並自動重新整理。 —百度百科

觀察著模式的程式碼體現

首先,我們建立一個觀察者的介面Watcher

在裡面建立一個方法update(String str),當被觀察者的資料發生變化後,回撥此方法,所以,這個方法中需要完成當被觀察者資料變化後的業務邏輯。

/**
 * description:
 * author: dujun
 * created at: 2017/12/28 17:31
 * update: 2017/12/28
 * version:
 */
public interface Watcher {
    void update(String str);   // 當被觀察者資料發生變化後,回撥此方法
}

然後,我們建立被觀察者的介面Watched

在裡面建立三個抽象方法 ,其實現類將實現此三個抽象方法的業務邏輯
1.void addWatcher(Watcher watcher); 此方法是給次被觀察者新增觀察者
2.void removeWatcher(Watcher watcher);此方法是移除新增進來的觀察者
3.void notifyWaters(String str);此方法是通知被新增進來的所有觀察者資料發生了變化

/**
 * description:
 * author: dujun
 * created at: 2017/12/29 9:21
 * update: 2017/12/29
 * version:
 */
public interface Watched { // 新增觀察者 void addWatcher(Watcher watcher); // 移除觀察者 void removeWatcher(Watcher watcher); // 通知被新增進來的所有觀察者資料發生了變化 void notifyWaters(String str); }

然後我們來完成被觀察者實現類WatcheredImpl

在被觀察者裡面建立一個List集合,來儲存被新增進來的觀察者Watcher.
在notifyWaters()方法中,回撥所有觀察者update方法,來通知觀察著資料發生了變花變化。

/**
 * description:
 * author: dujun
 * created at: 2017/12/29 9:33
 * update: 2017/12/29
 * version:
 */
public class WatcheredImpl implements Watched {
    private List<Watcher> list = new ArrayList<>();
    @Override
    public void addWatcher(Watcher watcher) {
        list.add(watcher);
    }

    @Override
    public void removeWatcher(Watcher watcher) {
        list.remove(watcher);
    }

    @Override
    public void notifyWaters(String str) {
        for (Watcher watcher : list) {
            watcher.update(str);
        }
    }
}

接著來完成觀察者實現類WatcherImpl

實現 update(String str)方法,在此方法中完成被觀察者資料變化後的業務邏輯,
此處,我的邏輯很簡單,就是當被觀察者資料發生變化後,在控制檯輸出一個字串。

/**
 * description:
 * author: dujun
 * created at: 2017/12/29 9:38
 * update: 2017/12/29
 * version:
 */
public class WatcherImpl implements Watcher {
    @Override
    public void update(String str) {
        // 在此完成被觀察者資料變化後的業務邏輯
        System.out.println(str);
    }
}

最後我們來測試的我們上面完成的觀察者模式

編寫測試類Test,測試類中,所有步驟的註釋都寫的很詳細了,我這裡就不再囉嗦。

/**
 * description:
 * author: dujun
 * created at: 2017/12/29 9:41 
 * update: 2017/12/29
 * version: 
 */
public class Test {
    public static void main(String [] args) throws Exception{
        // 建立一個被觀察者
        WatcheredImpl watchered = new WatcheredImpl();

        // 建立三個觀察者的例項物件
        WatcherImpl watcher1 = new WatcherImpl();
        WatcherImpl watcher2 = new WatcherImpl();
        WatcherImpl watcher3 = new WatcherImpl();

        // 將三個觀察者新增到被觀察者中
        watchered.addWatcher(watcher1);
        watchered.addWatcher(watcher2);
        watchered.addWatcher(watcher3);

        // 被觀察者資料發生變化,通知觀察者
        watchered.notifyWaters("被觀察者資料發生了變化");
    }
}

結果展示

執行測試類Test,
這裡寫圖片描述
三個觀察著都接受到了觀察者資料的變化,並作出了響應。

寫在後面