天天看點

觀察者模式

    應對的情況:當一個可觀察者的狀态發生改變時,觀察者的資料也要實時更新。

    你可能第一時間會想到的是,直接在可觀察者類上調用觀察者的方法就行了。是的,這是一種最直接,也是最簡單的方法。但這樣做就使得可觀察者和觀察者的耦合性很高,且不能動态更改觀察者的數量。

    我們或許可以這樣做,寫一個可觀察者的接口:

再寫一個觀察者的接口:

然後我們再寫一個可觀察者的實作類:

再來一個觀察者的實作類:

最後來一個測試類:

    一個完整的觀察者模式流程下來,是不是覺得很有意思。這樣我的可觀察者就不必知道觀察者們的具體細節,隻要觀察者們實作觀察者接口就行了,觀察者們也可以動态地注冊或移除。這樣的耦合性就大大地降低了。

    對,還有就是java也有内置的觀察者模式,就是:

不過它有一個黑暗面,就是observable是一個類,而不是一個接口,而且它将一些關鍵的方法protected起來了,這樣我們隻能繼承它,而不能執行個體化它并組合到自己對象中,java不支援多重繼承也限制了observable的複用潛力。(違反了設計原則:多用組合,少用繼承)。

    如果java内置的觀察者模式可以符合你的需求,為了簡單起見,也可以使用。如果不符合,也可以自己寫那些接口,反正也不難。

    對,還有就是,除了可觀察者可以将資料“推”給觀察者之外(即可觀察者中的通知方法調用觀察者的統一方法),觀察者也可以将資料從可觀察者中“拉”回來(即觀察者調用可觀察者中的getter方法),兩種都行,不過我們認為“推”的方法更“正确”,而“拉”的方法,我們可以做到動态調用所需的資料。

繼續閱讀