行為型模式
觀察者(依賴倒轉)
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並被自動更新。
對象間,尤其是具體對象間,相互知道的越少越好,這樣發生改變時才不至於相互影響。對觀察者模式來說,目標和觀察者不是緊密耦合的,它們可以屬於一個系統中的不同抽象層次,目標所知道的僅僅是它有一系列的觀察者,每個觀察者實現Observer的簡單介面,目標是不知道觀察者屬於哪一個具體類的。這樣就可以解除對象間的緊耦合關係。
模板(裡氏代換)
定義一個操作的演算法骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
代碼重複是編程中最常見、最糟糕的“壞味道”,如果我們在一個以上的地方看到相同的程式結構,那麼可以肯定,設法將它們合而為一,程式會變得更好。完全相同的代碼當然存在明顯的重複,而微妙的重複會出現在表面不同但是本質相同的結構或處理步驟中,這使得我們一定要小心處理。
繼承的一個非常大的好處就是你能免費地從基類擷取一些東西,當你繼承一個類時,衍生類別馬上就可以獲得基類中所有的功能,你還可以在它的基礎上任意增加新的功能。
模板方法模式由一個抽象類別組成,這個抽象類別定義了需要覆蓋的可能有不同實現的模板方法,每個從這個抽象類別派生的具體類將為此模板實現新方法。這樣就使得可重複的代碼都提煉到抽象類別中了,這就實現了代碼的重用。
命令(單一職責)
將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數化;可以對請求排隊或記錄請求日誌,以及支援可撤銷的操作。
將請求寄件者與具體實現者分離,就是將叫用作業的對象與知道如何?該操作的對象解耦。命令模式可以在不同的時刻指定、排列和執行請求。可以在實施操作前將狀態儲存起來,以便支援取消/重做的操作,還可以記錄整個操作的日誌,以便以後可以在系統出問題時尋找原因或恢複重做。這也意味著命令模式可以支援事物,要麼所有的命令全部執行成功,要麼恢複到什麼也沒執行的狀態。總之,如果有類似的請求,利用命令模式分離要求者與實現者是最明智的選擇。
狀態
允許一個對象在其內部狀態改變時改變它的行為,讓對象看起來似乎修改了它的類。
在編程中往往會遇到條件分支大量應用的問題,如果條件分支語句沒有涉及重要的商務邏輯或者不會隨著時間的變化而變化,也不會有任何的可擴充性,也就是說它幾乎不會變化,此時條件分支是應該使用的。但是這裡有很多前提,而且這些前提往往都是不成立的,事實上,不會變化的需求很少,不需要擴充的軟體也很少,那麼如果把這樣的分支語句進行分解並封裝成多個子類,利用多態來提高其可維護性、可擴充性的需要,是非常重要的。
狀態模式提供了一個更好的辦法來組織與特定狀態相關的代碼,決定狀態轉移的邏輯不在單塊的if或switch中,而是分布在各個狀態子類之間,又有所有與狀態相關的代碼都存在於某個狀態子類中,所以通過定義新的子類可以很容易地增加新的狀態和轉換。
職責鏈
使多個對象都有機會處理請求,從而避免請求的寄件者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
同樣是將請求寄件者與具體實現者分離。我們時常會碰到這樣的情況:有多個對象可以處理一個請求,但是哪個對象處理該請求事先並不知道,要在運行時刻自動確定,此時,最好的辦法就是讓請求寄件者與具體處理這分離,讓客戶在不明確指定接收者的情況下提交一個請求,然後由所有能處理這一請求的對象連成一條鏈,並沿著這條鏈傳遞該請求,知道有一個對象處理它為止。