一、定義
中介者模式的定義為: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抽象中介者角色:定義統(tǒng)一的接口醉途,用于各同事角色之間的通信捕犬。
- Concrete Mediator具體中介者角色:通過協(xié)調各同事角色實現協(xié)作行為跷坝,因此它bi'xu必須依賴于各個同事角色酵镜。
- Colleague同事角色:每個同事角色都知道中介者角色,并且與其他同事角色通信的時候柴钻,一定要通過中介者角色協(xié)作淮韭。每個同事類的行為分為兩種:一種是同事本身的行為,比如改變對象本身的狀態(tài)贴届,處理自己的行為等靠粪,這種行為叫做自發(fā)行為(Self-Method),與其他同事類或中介者沒有任何的依賴粱腻;第二種是必須依賴中介者才能完成的行為庇配,叫做依賴方法(Dep-Method)。
//通用抽象中介者
public abstract class Mediator {
//定義同事類
protected ConcreteColleague1 c1;
protected ConcreteColleague2 c2;
//getter/setter
...
//中介者模式的業(yè)務邏輯
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(){
//處理自己的業(yè)務邏輯
}
//依賴方法 dep-method
public void depMethod1(){
//處理自己的業(yè)務邏輯
//自己不能處理的業(yè)務邏輯绍些,委托給中介者處理
super.mediator.doSomething1();
}
}
public class ConcreteColleague2 extends Colleague {
//通過構造函數傳遞中介者
public ConcreteColleague2(Mediator _mediator){
super(_mediator);
}
//自有方法 self-method
public void selfMethod2(){
//處理自己的業(yè)務邏輯
}
//依賴方法 dep-method
public void depMethod2(){
//處理自己的業(yè)務邏輯
//自己不能處理的業(yè)務邏輯捞慌,委托給中介者處理
super.mediator.doSomething2();
}
}
二、應用
2.1 優(yōu)點
中介者模式的優(yōu)點是減少類間的依賴柬批,把原有的一對多的依賴變成了一對一的依賴啸澡,同事類只依賴中介者,減少了依賴氮帐,當然同時也降低類類間的耦合嗅虏。
2.2 缺點
中介者模式的缺點就是中介者會膨脹得很大,而且邏輯復雜上沐,原本N個對象直接的相互依賴關系轉換為中介者和同事類的依賴關系皮服,同事類越多,中介者的邏輯就越復雜参咙。
2.3 使用場景
類之間的依賴關系是必然存在的龄广,一個類依賴多個類的情況也是存在的,存在即合理蕴侧,那是否可以說只要有多個依賴關系就考慮使用中介者模式呢择同?答案是否定的。中介者模式未必能幫你把原本凌亂的邏輯整理得清清楚楚净宵,而且中介者模式也是有缺點的敲才,這個缺點在使用不當時會被放大,比如原本就簡單的幾個對象依賴關系择葡,如果為了使用模式而加入了中介者紧武,必然導致中介者的邏輯復雜化,因此中介者模式的使用需要“量力而行”刁岸!中介者模式適用于多個對象之間緊密耦合的情況脏里,緊密耦合的標準是:在類圖中出現了蜘蛛網狀結構。在這種情況下一定要考慮使用中介者模式虹曙,這有利于把蜘蛛網梳理為星型結構迫横,使原本復雜混 亂的關系變得清晰簡單。
三酝碳、實際應用
中介者模式也叫做調停者模式矾踱,是什么意思呢?一個對象要和N多個對象交流疏哗,就像對象間的戰(zhàn)爭呛讲,很混亂。這時返奉,需要加入一個中心贝搁,所有的類都和中心交流,中心說怎么處理就怎么處理芽偏。
大家都應該使用過Struts雷逆,MVC框架,其中的C(Controller)就是一個中介者污尉,叫做前端 控制器(Front Controller)膀哲,它的作用就是把M(Model,業(yè)務邏輯)和V(View被碗,視圖)隔離開某宪, 協(xié)調M和V協(xié)同工作,把M運行的結果和V代表的視圖融合成一個前端可以展示的頁面锐朴,減少 M和V的依賴關系兴喂。MVC框架已經成為一個非常流行、成熟的開發(fā)框架焚志,這也是中介者模式 的優(yōu)點的一個體現衣迷。