設計模式筆記(10 MEDIATOR & MEMENTO)

MEDIATOR(中介者)
適用性
1.一組對象以定義良好但是複雜的方式進行通信,產生相互依賴關係混亂且難以理解。
2.一個對象引用很多其他對象並且直接與這些對象通信,導致難以複用該對象。
3.想定製分佈在多個類中的行爲,而又不想生成太多的子類

思考:
    MEDIATOR模式雖然是協調對象的,但是對對象的組織方式也會帶來重大影響。對於一組相互作用的對象,這種相互關係是網狀的,搞清楚這組對象之間的聯繫是很困難的。通過MEDIATOR把這種網狀的關係變成星型關係,對象之間的聯繫被切斷了,只要抓住中介對象,就可以理清這一組對象。這樣做的代價是,中介對象本身將可能變得非常複雜。通常,這種複雜性表現在接口上,這樣一個複雜的、低內聚的接口是難以被複用的,一般也不應該複用中介者對象,那樣將會限制中介者的演化。
    一個工作對象要和許多對象交互,意味着如果要複用該對象的某種功能,就必須同時提供該對象需要與之交互的那些對象,事情因此而變得複雜。那麼提供一箇中介者,在中介者中封裝訪問其他所需對象的方法,那麼,工作對象只需要和中介者交互就能獲取必須的支持。從工作對象的視角來看,中介者很象是FACADE模式的實現,和FACADE不同的是,中介者提供的接口不像FACADE提供的那樣有完備的含義,中介者提供的是一些方法的簡單堆砌,而且,工作對象也無法繞過中介者直接訪問子系統。這正是MEDIATOR和FACADE在意圖上的區別之一。
    第三個適用性的關注點是中介者本身,而前兩點關注點都是在工作對象上。對於這一點,我覺得比較茫然。如果從字面來理解的話,中介者需要處於一個調停人的角色,並且中介者通常作爲動作的發起者纔有必要這麼做。中介者需要藉助其他對象來完成某些事情,從這個角度來說,這樣的中介者和模版方法又神似而形非了。例如,中介者的某個方法是個一般的方法模版,假設其中的步驟方法爲A,B,C。如果ABC是通過子類化重載來實現的,那是模版方法。如果ABC是分別通過Aobj的FunA,BObj的FunB,CObj的FunC來完成的,而這三個Object是中介者本身來控制的(甚至可以動態裝配),也實現了模版方法的一般意圖。並且,該方法還具備模版方法不具備的動態配置能力,這又像是策略模式的某些行爲方式了。

MEMENTO(備忘錄)
適用性:
1.必須保存某一對象在某一時刻的狀態,這樣,以後需要它是才能恢復到先前的狀態。
2.如果用一個接口來讓其他對象直接得到這些狀態,將會暴露對象的實現細節並破壞對象的封裝性。

思考:
可以把MEMENTO看做是一種還原點,也可以用來實現COMMAND對象的undo方法。還可以用來保存FlyWeight模式中對象的變化部分。對於實現上,通常MEMENTO需要實現寬、窄兩套接口。在C++中,通常是使用friend來區分寬窄接口,然而,實際上也可以採用接口的多重繼承來分離寬、窄接口。一種是通過dynamic_cast來轉換,另一個手段是藉助一個間接層來實現改目的()。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章