我的在CSDN的BLOG:http://blog.csdn.net/feb13/article/details/7906868java
MEDIATOR 中介者設計模式
參考《設計模式——可複用面向對象軟件的基礎》和《研磨設計模式》的讀書筆記。ide
一、 意圖this
用一箇中介者對象來封裝一系列的對象交互。中介者使其各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立改變它們之間的交互。.net
二、 適用性設計
三、 結構code
四、 參與者server
Mediatord(中介者)對象
——中介者定義一個接口用於與各同事(Colleague)對象通訊。blog
ConcreteMediator(具體中介者)
——瞭解中介者經過協調各同事對象實現協做行爲。
——瞭解並維護它的各個同事。
ColleagueClass(同事類,包括其子類)
——每個同事類都知道它的中介者對象。
——每個同事類對象在需與其餘同事通訊的時候,與它的中介者通訊。
五、 協做
同事向一箇中介者對象發送和接收請求。中介者在各同事間適當地轉發請求以實現協做行爲。
六、 效果
1) 減小了子類生成;Mediator將本來分佈於多個對象間的行爲集中在一塊兒。改變這些行爲只須要生成Mediator的子類便可。這樣各個Colleague類可被重用。
2) 它將各Colleague解耦;Mediator有利於各Colleague間的鬆耦合。你能夠獨立地改變和複用Colleague類和Mediator類。
3) 它簡化了對象協議;用Mediator和各Colleague間的一對多的交互來代替多對多的交互。一對多的關係更易於理解、維護和擴展。
4) 它對對象如何協做進行了抽象;將中介做爲一個獨立的概念並將其封裝在一個對象中,使你將注意力從對象各自自己的行爲轉移到它們之間的交互上來。這有助於弄清楚一個系統中的對象是如何交互的。
5) 它使控制集中化;中介者模式將交互的複雜性變爲中介者的複雜性。由於中介者封裝了協議,它可能變得比任一個Colleague都複雜。這可能使得中介者自身成爲一個難以維護的龐然大物。
七、 實現
1) 忽略抽象的Mediator類;當各Colleague僅與一個Mediator一塊兒工做時,沒有必要定義一個抽象的Mediator類。Mediator類提供的抽象耦合已經使各Colleague可與不一樣的Mediator子類一塊兒工做,反之亦然。
2) Colleague——Mediator通訊;當一個感興趣的事件發生時,Colleague必須與其Mediator通訊。一種實現方法是 Observer模式,將Mediator實現爲一個Observer,各Colleague做爲Subset,一旦其狀態改變就發送通知給 Mediator;一種方法是在Mediator中定義一個特殊的通知接口,各Colleague在通訊時直接調用該接口。
八、 代碼示例
Mediatord
package com.examples.pattern.mediator; /** * 中介者,定義各個同事對象通訊的接口 */ public interface Mediator { /** * 同事對象自身改變的時候來通知中介者的方法 讓中介者去負責相應的與其餘同事對象的交互 * * @param colleague * 同事對象自身,好讓中介者對象經過對象實例去得到同事對象的狀態 */ public void changed(Colleague colleague); }
ConcreteMediator
package com.examples.pattern.mediator; /** * 具體的中介者實現 */ public class ConcreteMediator implements Mediator { /** * 持有並維護同事A */ private ConcreteColleagueA colleagueA; /** * 持有並維護同事B */ private ConcreteColleagueB colleagueB; /** * 設置中介者須要瞭解並維護的同事A對象 * @param colleagueA */ public void setColleagueA(ConcreteColleagueA colleagueA) { this.colleagueA = colleagueA; } /** * 設置中介者須要瞭解並維護的同事B對象 * @param colleagueB */ public void setColleagueB(ConcreteColleagueB colleagueB) { this.colleagueB = colleagueB; } @Override public void changed(Colleague colleague) { System.out.println(colleague); } }
Colleague Class
package com.examples.pattern.mediator; /** * 同事類的抽象父類 */ public abstract class Colleague { /** * 持有中介者對象,每個同事類都知道它的中介者對象 */ private Mediator mediator; /** * 構造者方法,傳入中介者對象 * @param mediator */ public Colleague(Mediator mediator) { this.mediator = mediator; } /** * 得到當前同事類對應的中介者對象 * @return */ public Mediator getMediator() { return mediator; } }
package com.examples.pattern.mediator; /** * 具體的同事類A */ public class ConcreteColleagueA extends Colleague { public ConcreteColleagueA(Mediator mediator) { super(mediator); } public void someOperation(){ //在須要跟其餘同事通訊的時候,通知中介者對象 getMediator().changed(this); } }
package com.examples.pattern.mediator; public class ConcreteColleagueB extends Colleague { public ConcreteColleagueB(Mediator mediator) { super(mediator); } public void someOperation(){ //在須要跟其餘同事通訊的時候,通知中介者對象 getMediator().changed(this); } }
Client
package com.examples.pattern.mediator; public class Client { public static void main(String[] args) { ConcreteMediator mediator = new ConcreteMediator(); ConcreteColleagueA ca = new ConcreteColleagueA(mediator); ConcreteColleagueB cb = new ConcreteColleagueB(mediator); mediator.setColleagueA(ca); mediator.setColleagueB(cb); ca.someOperation(); cb.someOperation(); } }
九、 相關模式
Façade與中介者的不一樣之處在於它是對 一個對象子系統進行抽象,從而提供了一個更方便的接口。它的協議是單向的,即Façade對象對這個子系統類提出請求,但反之則不行。相 反,Mediator提供了各Colleague對象不支持或不能支持的協做行爲,並且協議是多向的。
Colleague可以使用Observer模式與Mediator通訊。
十、 廣義中介者
在咱們的一般使用中,常常會簡化中介者模式,來使開發變得簡單,有以下變化: