中介者模式
一丶定義
定義一個中介者對象, 封裝一系列對象的交互關系, 使得各對象不必顯示的相互引用, 從而使其耦合松散, 而且可以獨立的改變它們的交互
二丶理解
各對象顯式地持有對方引用, 用於對象之間的交互, 交互關系形成網狀結構, 不利於系統維護以及開發人員的理解. 這時可以定義一個中介者對象, 封裝注冊各對象的引用, 以及完成對象之間的交互操作. 同事對象之間不能直接交互, 它們之間的交互, 需要委托給中介者對象完成, 即 同事對象除了完成自己本身的操作之外, 只和中介者打交道(符合最少知識原則), 如此一來, 交互關系將由復雜的網狀結構變成星型結構. 方便系統維護以及開發人員的理解.
關鍵點在於同事對象之間不能直接交互, 交互依賴於中介者完成, 中介者注冊管理各同事對象的引用, 以及負責轉發消息, 實現他們之間的交互
1) Mediator 抽象中介者
用於定義統一的接口, 用於各同事對象之間的交互
2) Concrete Mediator 具體中介者
具體中介者持有各同事對象的引用, 負責協調各同事對象的行為以完成協作, 因此具體中介者必須依賴具體同事對象(不符合依賴倒置原則)
3) Colleague 同事角色
每個同事角色都知道中介者對象, 而且與其他同事角色通信的時候,都通過中介者協作完成
每個同事角色都有兩種行為:
a. 自發行為: 同事本身的行為, 如修改自身的狀態, 與其他同事或者中介者沒有任何的依賴.
b. 依賴方法: 必須依賴中介者才能完成的行為.
三丶示例
抽象中介者
public abstract class Mediator { //中介者記錄各具體同事類的引用, 用於交互 // 也可以是集合類記錄,如 List, Map protected ConcreteColleague1 colleague1; protected ConcreteColleague2 colleague2; // ------------------------- 因為中介者可以有部分同事類, 所以使用setter, getter 注入同事類 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; } // ------------------------------------------ 具體同事類依賴中介者的方法 //這種方法其實可以精簡成通用的發放 sendMessage(String toColleague, message) public abstract void sendMessageToColleague1(String message); // public abstract void sendMessageToColleague2(String message); }
具體中介者:
public class ConcreteMediator extends Mediator{ // 具體中介者一般只有一個, 即通用中介者 @Override public void sendMessageToColleague1(String message) { super.colleague1.receiveMessage(message); } @Override public void sendMessageToColleague2(String message) { super.colleague2.receiveMessage(message); } }
抽象同事角色:
public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } }
具體同事角色1:
public class ConcreteColleague1 extends Colleague { public ConcreteColleague1(Mediator mediator) { super(mediator); } // ---------- self-method public void selfMethod(){ System.out.println("colleague1: 自發行為..."); } public void receiveMessage(String message){ System.out.println("colleague1收到消息: "+message); } // ---------- dependency-method public void sendMessageToColleague2(String message){ // 同事類之間不能直接交互, 同事類不能完成的工作委托給中介者完成 super.mediator.sendMessageToColleague2(message); } }
具體同事2:
public class ConcreteColleague2 extends Colleague{ public ConcreteColleague2(Mediator mediator) { super(mediator); } // ---------- self-method public void selfMethod(){ System.out.println("colleague2: 自發行為..."); } public void receiveMessage(String message){ System.out.println("colleague2收到消息: "+message); } // ---------- dependency-method public void sendMessageToColleague1(String message){ // 同事類之間不能直接交互, 同事類不能完成的工作委托給中介者完成 super.mediator.sendMessageToColleague1(message); } }
具體同事3:
public class ConcreteColleague3 extends Colleague { public ConcreteColleague3(Mediator mediator) { super(mediator); } public void selfMethod(){ System.out.println("colleague3: 自發行為..."); } public void sendMessageToColleague1(String message){ super.mediator.sendMessageToColleague1(message); } public void sendMessageToColleague2(String message){ super.mediator.sendMessageToColleague2(message); } }
場景類:
public class Client { public static void main(String[] args) { Mediator mediator=new ConcreteMediator(); ConcreteColleague1 colleague1=new ConcreteColleague1(mediator); ConcreteColleague2 colleague2=new ConcreteColleague2(mediator); mediator.setColleague1(colleague1); mediator.setColleague2(colleague2); colleague1.selfMethod(); colleague1.sendMessageToColleague2("來自colleague1的賀電..."); colleague2.selfMethod(); colleague2.sendMessageToColleague1("來自colleague2的賀電..."); // 之后新增一個colleague3, 與其他同事類交互很清晰 ConcreteColleague3 colleague3=new ConcreteColleague3(mediator); colleague3.selfMethod(); colleague3.sendMessageToColleague1("來自colleague3的賀電..."); colleague3.sendMessageToColleague2("來自colleague3的賀電..."); } }
輸出結果:
colleague1: 自發行為... colleague2收到消息: 來自colleague1的賀電... colleague2: 自發行為... colleague1收到消息: 來自colleague2的賀電... colleague3: 自發行為... colleague1收到消息: 來自colleague3的賀電... colleague2收到消息: 來自colleague3的賀電...
完整源碼: 中介者模式
學習資料:
<設計模式之禪>