1. 程式人生 > >《大話設計模式》筆記(3)——行為型模式1

《大話設計模式》筆記(3)——行為型模式1

png 直接 客戶 命令模式 mage 定義 復雜 con 重新

14、觀察者模式

定義:又被稱為發布-訂閱(Publish/Subscribe)模式,它定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。

UML:

技術分享圖片

PS:事件委托就是觀察者模式的一種應用,觀察者註冊主題對象中的狀態變化事件,當主題對象狀態變化時,就會觸發狀態變化事件,使得所有註冊了該事件的方法都會被觸發。

15、模板方法模式

定義:模板方法模式定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重新定義該算法的某些特定步驟。

UML:

技術分享圖片

PS:

模板方法模式正如其名,父類就相當於是一個模板,提供一個整體的結構,具體類就是應用模板去填充模板裏的方法。

應用場景類比:試卷考題

16、命令模式(Command)

定義:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作。

UML:

技術分享圖片

PS:我覺得在作者的定義和UML中把請求和接受請求處理的Receiver,定義成一個命令(Command)更容易理解一些,這樣定義就可以這樣寫,“將一個命令封裝為一個對象,從而使你可用不同的命令對客戶進行參數化;對命令排隊或記錄命令日誌,以及支持可撤銷的操作。”,其實作者的這個UML圖的Receiver就是一個命令的執行者,我們可以對於不同的命令(Command)來對ConcreteCommand中的命令執行者Receiver來進行配置,而Invoker.ExcuteCommand()就是調用ConcreteCommand.Excute()方法。

參考代碼:

技術分享圖片

17、狀態模式(State)

定義:允許一個對象在其內部狀態改變時改變它的行為,這個對象看起來像是修改了它的類。

UML:

技術分享圖片

PS:光看定義時看得一臉茫然,但配合上面UML來解釋會更容易弄清楚。上面UML中每個ConcreteState.Handle()內部都有自己所能處理的狀態,當狀態發生改變時,則把指向自身的狀態state指向其它相應的狀態,並調用其Handle()去處理。比如最初調用Context.Request()時,它的狀態為A,這是state指向ConcreteStateA,調用state.Handle()時,則是調用的ConcreteStateA.Handle(),如果這時Context中的狀態改變為B時,這時調用state.Handle()時,還是調用的ConcreteStateA.Handle(),但是ConcreteStateA無法處理狀態B,所以這時ConcreteStateA則需要在Handle()中,把state指向ConcreteStateB,並調用ConcreteStateB.Handle()。

該模式與職責鏈模式容易弄混淆,其區別在於狀態模式是強調狀態發生變化的情況下,需改變自身的行為;而職責鏈模式是每個職位上的人內部都知道自己的下一級,當任務自己無法處理時,就把其轉給它的下一級。

當一個方法中有許多的狀態條件判斷時,可以考慮使用狀態模式。狀態模式把對狀態的判斷邏輯轉移到表示不同狀態的一系列類中,簡化了復雜的邏輯判斷。

應用場景類比:工作的狀態隨工作時間而發生變化

18、職責鏈模式(Chain of Responsibility)

定義:在職責鏈模式裏,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。

UML:

技術分享圖片

PS:抽象類Handler中定義了 一個私有的successor,然後每一個具體處理類ConcreteHandler通過SetSuccessor()方法去設置它的下一級,客戶端請求處理時直接把請求發給鏈條的第一個處理者就可以了,職責鏈模式會將請求傳遞給適合的處理者。

應用場景類比:加薪審批流程

《大話設計模式》筆記(3)——行為型模式1