設計模式 - 觀察者模式的6步演進 ( Observer ) 重點
阿新 • • 發佈:2020-10-12
.
第1種 面向物件 ( 不停的迴圈, 所以有問題 )
.
第2種 改變完狀態, 直接呼叫後續要執行的方法
可以簡化很多的程式碼
.
問題就是耦合度太高
當一個child醒來之後, 有多個監聽者, 每個監聽者各有自己的處理邏輯
如果有新的觀察者加進來, 得在多個地方加程式碼
.
第3種 類似責任鏈模式
讓所有觀察者實現同一個介面方法, 這樣就可以遍歷集合裡的觀察者物件, 依次呼叫介面方法
新加的觀察者, 只需要實現介面方法, 然後建立一個物件, 再加入到觀察者集合裡就行了
.
你以為快完了, 其實才剛開始, 繼續…
在實際應用當中, 場景是非常複雜的
小孩在早上哭, 給吃奶
小孩在中午哭, 哄睡覺
所以後續的動作, 是需要根據引數去判斷的, 有時需要多個引數, 於是, 我們把這些引數集中在一個Event類裡
.
第4種 加入WakeUpEvent類用於傳參
.
第5種 事件源物件
大多數時候, 我們處理事件的時候, 需要事件源物件 ( 不僅僅是取這個物件的引數, 有時候, 需要呼叫事件源物件的方法 )
這樣的話, 一個觀察者就可以觀察多個事件源, 這樣就可以少定義幾個觀察者class
source引數的型別儘量用 父類 / 介面 / Object , 這樣可觀察的物件種類就可以有很多
.
第6種 Event也可以形成繼承體系
舉個java.awt中的例子 KeyEvent > InputEvent > ComponentEvent > AWTEvent > EventObject
自己模擬一個
在模擬一次整體的, 長得有點像使用java.awt的程式碼
.
總結
下面這些名詞, 都是屬於觀察者模式
- Observer
- Listener
- Hook
- Callback