中介者模式(Mediator Pattern)。
定義:
用一箇中介物件封裝一系列的物件互動,中介者使各物件不需要顯示地相互作用,從而使其耦合鬆散,而且可以獨立地改變他們之間的互動。
中介者模式由以下幾部分組成:
- 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框架,把中介者模式應用到產品中,可以提升產品的效能和擴充套件性,但是對於專案開發就未必,因此專案時以交付投產為目標,而產品則是以穩定、高效、擴充套件為宗旨。
相關文章
- JAVA設計模式之 中介者模式【Mediator Pattern】Java設計模式
- 設計模式--中介者模式Mediator(行為型)設計模式
- 設計模式系列之中介者模式(Mediator Pattern)——協調多個物件之間的互動設計模式物件
- Rust語言之GoF設計模式:中介者Mediator模式RustGo設計模式
- 設計模式的征途—22.中介者(Mediator)模式設計模式
- Objective-C設計模式——中介者Mediator(物件去耦)Object設計模式物件
- Mediator(中介者)模式在iOS開發當中的使用模式iOS
- 設計模式之Mediator(中介者)這樣理解 對嗎?設計模式
- 建造者模式(Builder Pattern)模式UI
- 中介者模式模式
- 構建者模式(Builder pattern)模式UI
- 設計模式--建造者模式(Builder Pattern)設計模式UI
- (三)中介者模式模式
- 中介者(調停者)模式模式
- 設計模式之觀察者模式(Observer Pattern)設計模式Server
- JavaMediatorPattern(中介者模式)Java模式
- 行為型模式:中介者模式模式
- 設計模式之中介者模式設計模式
- 設計模式(十四)中介者模式設計模式
- 設計模式(十一):中介者模式設計模式
- 重識設計模式-建造者模式(Builder Pattern)設計模式UI
- C#設計模式-建造者模式(Builder Pattern)C#設計模式UI
- JAVA設計模式之 建造者模式【Builder Pattern】Java設計模式UI
- 設計模式實戰 - 中介者模式設計模式
- 極簡設計模式-中介者模式設計模式
- 設計模式系列之「中介者模式」設計模式
- Python設計模式-中介者模式Python設計模式
- 設計模式之中介者設計模式
- 設計模式(十七)中介者設計模式
- ios開發-中介者模式iOS模式
- Java設計模式之裝飾者模式(Decorator pattern)Java設計模式
- C#設計模式(17)——觀察者模式(Observer Pattern)C#設計模式Server
- C#設計模式(20)——策略者模式(Stragety Pattern)C#設計模式
- 設計模式-行為型模式-中介者模式設計模式
- 重構到觀察者模式 Refactor to Observer Pattern模式Server
- C#設計模式(16)——中介者模式C#設計模式
- 設計模式學習(十八)中介者模式設計模式
- 我的Java設計模式-中介者模式Java設計模式