學習設計模式 - 中介者模式


中介者模式

一丶定義

  定義一個中介者對象, 封裝一系列對象的交互關系, 使得各對象不必顯示的相互引用, 從而使其耦合松散, 而且可以獨立的改變它們的交互

 

二丶理解

   各對象顯式地持有對方引用, 用於對象之間的交互, 交互關系形成網狀結構, 不利於系統維護以及開發人員的理解. 這時可以定義一個中介者對象, 封裝注冊各對象的引用, 以及完成對象之間的交互操作. 同事對象之間不能直接交互, 它們之間的交互, 需要委托給中介者對象完成, 即 同事對象除了完成自己本身的操作之外, 只和中介者打交道(符合最少知識原則), 如此一來, 交互關系將由復雜的網狀結構變成星型結構.  方便系統維護以及開發人員的理解. 

  關鍵點在於同事對象之間不能直接交互, 交互依賴於中介者完成, 中介者注冊管理各同事對象的引用, 以及負責轉發消息, 實現他們之間的交互

 

  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的賀電...

 

   完整源碼:  中介者模式

 

 學習資料:

  <設計模式之禪>

  中介者模式|菜鳥教程

   中介者模式(詳解版)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM