中介模式(Mediator)也稱調停者模式,是一種比較簡單的模式。 定義: 用一個中介對象封裝一系列對象(同事)的交互,中介者使各對象不需要顯示地相互作用,從而使其耦合鬆散,而且獨立地改變它們之間的交互。 抽象中介者類圖如下: 中介者模式有以下4個角色: 抽象中介者(Mediator)角色:定義統一 ...
中介模式(Mediator)也稱調停者模式,是一種比較簡單的模式。
定義:
用一個中介對象封裝一系列對象(同事)的交互,中介者使各對象不需要顯示地相互作用,從而使其耦合鬆散,而且獨立地改變它們之間的交互。
抽象中介者類圖如下:
中介者模式有以下4個角色:
- 抽象中介者(Mediator)角色:定義統一的介面,用於各同事角色之間的通信。
- 具體中介者(Concrete Mediator)角色:該角色實現抽象中介者,它依賴於各個同事角色,並通過協調各同事角色實現協作行為。
- 抽象同事(Colleague)角色:該角色定義出中介者到同事對象的介面,同事對象只知道中介者而不知道其餘的同事對象。
- 具體同事(Concrete Colleague)角色:該角色實現抽象同事類,每一個同事角色都知道中介者角色,且與其他同事角色通信時,一定要通過中介者角色協作。
Mediator.java
public abstract class Mediator { // 定義同事類 protected ConcreteColleague1 c1; protected ConcreteColleague2 c2; // 通過getter/setter方法註入同事類 protected ConcreteColleague1 getC1() { return c1; } protected void setC1(ConcreteColleague1 c1) { this.c1 = c1; } protected ConcreteColleague2 getC2() { return c2; } protected void setC2(ConcreteColleague2 c2) { this.c2 = c2; } // 中介者的業務邏輯 public abstract void doSomething1(); public abstract void doSomething2(); }
ConcreteMediator.java
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(); } }
Colleague.java
public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } }
ConcreteColleague1.java
public class ConcreteColleague1 extends Colleague { // 通過構造函數傳遞中介者 public ConcreteColleague1(Mediator mediator) { super(mediator); } // 自有方法 self-method public void selfMethod1() { } // 依賴方法 dep-method public void depMethod1() { // 處理自己的業務邏輯 // 自己不能處理的業務邏輯,委托給中介者處理 super.mediator.doSomething1(); } }
ConcreteColleague2.java
public class ConcreteColleague2 extends Colleague { public ConcreteColleague2(Mediator mediator) { super(mediator); } // 自有方法 self-method public void selfMethod2() { } // 依賴方法 dep-method public void depMethod2() { // 處理自己的業務邏輯 // 自己不能處理的業務邏輯,委托給中介者處理 super.mediator.doSomething2(); } }
優點:
- 減少類間的依賴,將原有的一對多的依賴變成一對一的依賴,使得對象之間的關係更易維護和理解。
- 避免同事之間過度耦合,同事類只依賴中介者,使同事類更易被覆用,中介類和同事類可以相互獨立的演化。
- 中介者模式將對象的行為和協作抽象化,將對象在小尺度的行為上與其他對象的相互作用分開處理。
缺點:
- 增加了中介者類的複雜性。
- 中介者類經常充滿了各個具體同事類的關係協調代碼,這種代碼是不能復用的。
註意事項:
- 不應在責任劃分混亂時使用。責任分割的混亂會使系統中的對象與對象之間產生不適當的複雜關係。
- 不應當對數據類和方法類使用。
- 正確理解封裝。封裝首先是行為,以及行為所涉及的狀態的封裝。行為與狀態是不應該分割開的。中介者模式的用途是管理很多對象的相互作用,以便使這些對象專註於自身行為。
引用:
青島東合信息技術有限公司 . 設計模式(Java版) . 電子工業出版社,2012,142-146.
秦小波 . 設計模式之禪 . 機械工業出版社, 2014 , 254-256