中介者模式(Mediator Pattern)。

孤芳不自賞發表於2017-08-17

定義:

用一箇中介物件封裝一系列的物件互動,中介者使各物件不需要顯示地相互作用,從而使其耦合鬆散,而且可以獨立地改變他們之間的互動。

中介者模式由以下幾部分組成:

  • Mediator抽象中介者角色

抽象中介者角色定義統一的介面,用於各同事角色之間的通訊。

  • Concrete Mediator具體中介者角色

具體中介者角色通過協調各同事角色實現協作行為,因此它必須依賴於各個同事角色。

  • Colleague同事角色

每一個同事角色都知道中介者角色,而且與其他的同事角色的時候,一定要通過中介者角色協作。每個同事類的行為分為兩種:一種是同事本身的行為,比如改變物件本身的狀態,處理自己的行為等,這種行為叫做自發行為(Self-Method),與其他的同事類或中介者沒有任何的依賴;第二種是必須依賴中介者才能完成的行為,叫做依賴方法(Dep-Method)。

通用原始碼:

通用角色中介者

public abstract class Mediator {

// 定義同事類

protected ConcreteColleague1 c1;

protected ConcreteColleague2 c2;

// 通過getter/setter方法把同事類注入進來

public ConcreteColleague1 getC1() {

return c1;

}

public void setC1(ConcreteColleague1 c1) {

this.c1 = c1;

}

public ConcreteColleague2 getC2() {

return c2;

}

public void setC2(ConcreteColleague2 c2) {

this.c2 = c2;

}

// 中介者模式的業務邏輯

public abstract void doSomething1();

public abstract void doSomething2();

}

在Mediator抽象類中我們定義了同事類的注入,為什麼使用同事實現類注入而不使用抽象類注入呢?那是因為同事類雖然有抽象,但是沒有每個同事類必須要完成的業務方法,當然如果每個同事類都有相同的方法,比如execute、handler等,那當然注入抽象類,做到依賴倒置。

具體的中介者一般只有一個,即通用中介者。

通用中介者

public class ConcreteMediator extends Mediator {

@Override

public void doSomething1() {

// 呼叫同事類的方法,只要是public方法都可以呼叫

super.c1.selfMethod1();

super.c2.selfMethod2();

}

@Override

public void doSomething2(){

super.c1.selfMethod1();

super.c2.selfMethod2();

}

}

中介者所具有的方法doSomething1和doSomething2都是比較複雜的業務邏輯,為同事類服務,其實現是依賴各個同時類來完成的。

抽象同事類

public abstract class Colleague {

protected Mediator mediator;

public Colleague(Mediator _mediator) {

this.mediator = _mediator;

}

}

這個基類也非常簡單。一般來說,中介者模式中的抽象都比較簡單,是為了建立這個中介而服務的。

具體同事類,另一個程式碼相同,省略

public class ConcreColleague1 extends Colleague {

// 通過建構函式傳遞中介者

public ConcreColleague1(Mediator _mediator) {

super(_mediator);

}

// 自有方法 self-method

public void selfMethod1(){

// 處理自己的業務邏輯

}

// 依賴方法 dep-method

public void depMethod1(){

// 處理自己的業務

//自己不能處理的業務邏輯,委託給中介者處理

super.mediator.doSomething1();

}

}

為什麼同事類要使用建構函式注入中介者,而中介者使用getter/setter方式注入同事類呢?這是因為同事類必須有中介者,而中介者卻可以只有部分同事類。

優點:

中介者模式的優點就是減少類間的依賴,把原有的一對多的依賴變成了一對一的依賴,同事類只依賴中介者,減少了依賴,當然同事也降低了類間的耦合。

缺點:

中介者模式的缺點就是中介者會膨脹的很大,而且邏輯複雜,原本N個物件直接的相互依賴關係轉換為中介者和同事類的依賴關係,同事類越多,中介者的邏輯越複雜。

使用場景:

中介者模式適用於多個物件之間緊密耦合的情況,緊密耦合的標準是:在類圖中出現了蜘蛛網狀結構。在這種情況下一定要考慮使用中介者模式,這有利於把蜘蛛網梳理為星型結構,使原本複雜混亂的關係變得清晰簡單。

實際應用:

中介者也叫走調停者模式,是什麼意思呢?一個物件要和N多個物件交流,就像物件間的戰爭,很混亂。這時,就需要加入一箇中心,所有的類都和中心交流,中心說怎麼 處理就怎麼處理。

  • 機場排程中心
  • MVC框架
  • 媒體閘道器
  • 中介服務

最佳實踐:

在如下的情況下嘗試使用中介者模式:

  • N個物件之間產生了相互的依賴關係(N>2)。
  • 多個物件有依賴關係,但是依賴的行為尚不確定或者有發生改變的可能,在這種情況下一般建議採用中介者模式,降低變更引起的風險擴散。
  • 產品開發。一個明顯的例子就是MVC框架,把中介者模式應用到產品中,可以提升產品的效能和擴充套件性,但是對於專案開發就未必,因此專案時以交付投產為目標,而產品則是以穩定、高效、擴充套件為宗旨。

 

相關文章