1. 程式人生 > 實用技巧 >設計模式 - 觀察者模式的6步演進 ( Observer ) 重點

設計模式 - 觀察者模式的6步演進 ( Observer ) 重點

.

第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

在很多系統中, Observer模式往往和責任鏈共同負責事件的處理, 其中的某一個observer負責是否將事件進一步傳遞