一、定義
中介者模式的定義為:Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.(用一個中介對象封裝一系列的對象交互,中介者使各對象不需要顯式的相互作用,從而使其耦合松散,而且可以獨立的改變他們之間的交互。)
中介者模式的通用類圖如圖:
從類圖中看,中介者模式由以下幾部分組成:
- Mediator抽象中介者角色:定義統一的接口,用于各同事角色之間的通信。
- Concrete Mediator具體中介者角色:通過協調各同事角色實現協作行為,因此它bi'xu必須依賴于各個同事角色。
- Colleague同事角色:每個同事角色都知道中介者角色,并且與其他同事角色通信的時候,一定要通過中介者角色協作。每個同事類的行為分為兩種:一種是同事本身的行為,比如改變對象本身的狀態,處理自己的行為等,這種行為叫做自發行為(Self-Method),與其他同事類或中介者沒有任何的依賴;第二種是必須依賴中介者才能完成的行為,叫做依賴方法(Dep-Method)。
//通用抽象中介者
public abstract class Mediator {
//定義同事類
protected ConcreteColleague1 c1;
protected ConcreteColleague2 c2;
//getter/setter
...
//中介者模式的業務邏輯
public abstract void doSomething1();
public abstract void doSomething2();
}
//通用中介者
public class ConcreteMediator extends Mediator {
@Override
public void doSomething1(){
super.c1.selfMethod1();
super.c2.selfMethod2();
}
public void doSomething2(){
super.c1.selfMethod1();
super.c2.selfMethod2();
}
}
//抽象同事類
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator _mediator) {
this.mediator = _mediator;
}
}
//具體同事類
public class ConcreteColleague1 extends Colleague {
//通過構造函數傳遞中介者
public ConcreteColleague1(Mediator _mediator){
super(_mediator);
}
//自有方法 self-method
public void selfMethod1(){
//處理自己的業務邏輯
}
//依賴方法 dep-method
public void depMethod1(){
//處理自己的業務邏輯
//自己不能處理的業務邏輯,委托給中介者處理
super.mediator.doSomething1();
}
}
public class ConcreteColleague2 extends Colleague {
//通過構造函數傳遞中介者
public ConcreteColleague2(Mediator _mediator){
super(_mediator);
}
//自有方法 self-method
public void selfMethod2(){
//處理自己的業務邏輯
}
//依賴方法 dep-method
public void depMethod2(){
//處理自己的業務邏輯
//自己不能處理的業務邏輯,委托給中介者處理
super.mediator.doSomething2();
}
}
二、應用
2.1 優點
中介者模式的優點是減少類間的依賴,把原有的一對多的依賴變成了一對一的依賴,同事類只依賴中介者,減少了依賴,當然同時也降低類類間的耦合。
2.2 缺點
中介者模式的缺點就是中介者會膨脹得很大,而且邏輯復雜,原本N個對象直接的相互依賴關系轉換為中介者和同事類的依賴關系,同事類越多,中介者的邏輯就越復雜。
2.3 使用場景
類之間的依賴關系是必然存在的,一個類依賴多個類的情況也是存在的,存在即合理,那是否可以說只要有多個依賴關系就考慮使用中介者模式呢?答案是否定的。中介者模式未必能幫你把原本凌亂的邏輯整理得清清楚楚,而且中介者模式也是有缺點的,這個缺點在使用不當時會被放大,比如原本就簡單的幾個對象依賴關系,如果為了使用模式而加入了中介者,必然導致中介者的邏輯復雜化,因此中介者模式的使用需要“量力而行”!中介者模式適用于多個對象之間緊密耦合的情況,緊密耦合的標準是:在類圖中出現了蜘蛛網狀結構。在這種情況下一定要考慮使用中介者模式,這有利于把蜘蛛網梳理為星型結構,使原本復雜混 亂的關系變得清晰簡單。
三、實際應用
中介者模式也叫做調停者模式,是什么意思呢?一個對象要和N多個對象交流,就像對象間的戰爭,很混亂。這時,需要加入一個中心,所有的類都和中心交流,中心說怎么處理就怎么處理。
大家都應該使用過Struts,MVC框架,其中的C(Controller)就是一個中介者,叫做前端 控制器(Front Controller),它的作用就是把M(Model,業務邏輯)和V(View,視圖)隔離開, 協調M和V協同工作,把M運行的結果和V代表的視圖融合成一個前端可以展示的頁面,減少 M和V的依賴關系。MVC框架已經成為一個非常流行、成熟的開發框架,這也是中介者模式 的優點的一個體現。