來源:《設計模式之禪》設計模式
定義:用一箇中介者對象封裝一系列對象的交互,中介者使各個對象不須要顯示的相互做用,從而使其耦合鬆散,並且能夠獨立的改變他們之間的交互。中介者也叫調停者模式。ide
組成部分:this
抽象中介者角色(mediator):定義角色統一接口,用戶各個同事之間的交互。設計
具體中介者角色(concrete mediator):實現抽象中介者角色接口,協調各個同事角色之間的交互,以來於各個同事角色。code
同事角色(colleague):每一個同時類都知道中介者角色,與其餘同事類角色的交互,必定須要經過中介者協做。對象
類圖:接口
通用代碼:get
抽象中介者:io
/** * */ package cc.rico.pattern.mediator; /** * @author rico * 抽象中介者 */ public abstract class AbstractMediator { protected ConcreteColleague1 colleague1; protected ConcreteColleague2 colleague2; public abstract void doColleague1Action(); public abstract void doColleague2Action(); public ConcreteColleague1 getColleague1() { return colleague1; } public void setColleague1(ConcreteColleague1 colleague1) { this.colleague1 = colleague1; } public ConcreteColleague2 getColleague2() { return colleague2; } public void setColleague2(ConcreteColleague2 colleague2) { this.colleague2 = colleague2; } }
具體中介者:class
/** * */ package cc.rico.pattern.mediator; /** * @author rico * 具體中介者 */ public class Mediator extends AbstractMediator { @Override public void doColleague1Action() { super.colleague1.doAction(); } @Override public void doColleague2Action() { super.colleague2.doAction(); } }
抽象同事類:
/** * */ package cc.rico.pattern.mediator; /** * @author rico * 抽象同事類 */ public abstract class Colleague { protected AbstractMediator mediator; public Colleague(AbstractMediator mediator) { this.mediator = mediator; } }
具體同事類1:
/** * */ package cc.rico.pattern.mediator; /** * @author rico * 具體同事類1 */ public class ConcreteColleague1 extends Colleague { public ConcreteColleague1(AbstractMediator mediator) { super(mediator); } public void doAction() { System.out.println("ConcreteColleague1.doAction......"); } public void doDepend() { System.out.println("ConcreteColleague1.doDepend......"); super.mediator.doColleague2Action(); } }
具體同事類2:
/** * */ package cc.rico.pattern.mediator; /** * @author rico * 具體同事類2 */ public class ConcreteColleague2 extends Colleague { public ConcreteColleague2(AbstractMediator mediator) { super(mediator); } public void doAction() { System.out.println("ConcreteColleague2.doAction......"); } public void doDepend() { System.out.println("ConcreteColleague2.doDepend......"); super.mediator.doColleague1Action(); } }
/** * */ package cc.rico.pattern.mediator; /** * @author rico * */ public class Client { /** * @param args */ public static void main(String[] args) { // 中介者 AbstractMediator mediator = new Mediator(); // 同事類 ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator); ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator); mediator.setColleague1(colleague1); mediator.setColleague2(colleague2); System.out.println("####Colleague1.doDepend..."); colleague1.doDepend(); System.out.println("###Colleague2.doDepend..."); colleague2.doDepend(); } }
中介者模式優勢:
減小類之間的依賴關係,把原有一對多的依賴變成一對一的依賴,同事類只依賴中介者,下降了類間的耦合。
中介者模式缺點:
中介者類膨脹,邏輯複雜,把本來類間的依賴關係轉換爲中介者與同事類間的依賴關係,同事類越多,中介者的邏輯越複雜。
使用場景:
適用於多個對象之間緊密耦合的狀況,即類圖中出現了蜘蛛網結構。