我們接著說行為模式:
中介者(Mediator):
定義:
用一個中介對象來封裝一系列的對象互動。中介者使各對象不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。
結構圖:
解釋:
將原來兩個直接引用或者依賴的對象拆開,在中間加入一個"中介"對象,使得兩頭的對象分別和"中介"對象引用或者依賴。由於中介者的行為與要使用的資料與具體業務緊密相關,抽象中介者角色提供一個能方便很多個物件使用的介面是不太現實的。所以抽象中介者角色往往是不存在 的,或者只是一個標示介面。
中介者模式和面板模式的對比:
- 中介者模式解決的是多個對象之間的通訊問題,減少類之間的關聯面板模式解決的是子系統的介面複雜度問題
- 中介者模式中對象可以向中介者請求,面板模式中對象不會對外觀有任何協作請求。
舉例:聯合國安理會
備忘錄(Memento):
定義:
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象之外儲存這個狀態。這樣以後就可將該對象恢複到原先儲存的狀態。
結構圖:
解釋:
在這裡,我們希望Originator的State是可以備份和恢複的,其他屬性是無關的。我們可以在希望備份Originator的地方,調用Creatememento方法,在希望恢複Originator部分屬性的地方,調用SetMemento方法,同時Caretaker對Memento進行管理。
舉例:儲存遊戲進度。
觀察者(Observer):
定義:
定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主體對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。
結構圖:
解釋:
我們可以看到ConcreteSubject中保留了多個Observer的引用(SubjectSate),在Notify方法中,它會依次調用每個Observer的Update方法,從而更新“訂閱者”的狀態。
舉例:前台觀察老闆是否回來。
狀態(State):
定義:
當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類。
結構圖:
解釋:
使用者只與Context關聯,在Context內部,會維護不同狀態之間的跳轉,簡單來說,就是在Handle內部判斷傳入的state值,如果符合商務邏輯,那麼直接調用state的Handle方法;如果不符合,那麼修改state值,然後調用相應state的Handle方法。
舉例:早中晚的學習狀態
策略(Strategy):
定義:
定義了演算法家族,分別封裝起來,讓它們之間可以相互替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。
結構圖:
解釋:
1.多個類只區別在表現行為不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行為。(例如FlyBehavior和QuackBehavior)
2.需要在不同情況下使用不同的策略(演算法),或者策略還可能在未來用其它方式來實現。(例如FlyBehavior和QuackBehavior的具體實現
可任意變化或擴充)
3.對客戶(Duck)隱藏具體策略(演算法)的實現細節,彼此完全獨立。
舉例:商場促銷
訪問者(Visitor):
定義:
表示一個作用於某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
結構圖:
解釋:
這裡我們假設集合中只包括了2中不同的類型,ObjectStructure就是上面提到的集合,它包含多個不同的Element元素,業務的核心實現是在ConcreteVisitor1和ConcreteVisitor2中,對於ConcreteElement的Accept方法來說,它只是調用visitor.VisitconcreteElementA方法。
舉例:男人和女人的不同
迭代(Iterator):
定義:
提供一種方法順序訪問一個彙總對象中各個元素,而又不暴露該對象的內部表示。
結構圖:
解釋:
.NET來設計了兩個介面來實現迭代:IEnumerator和IEnumerable。
舉例:公交車查票。