設計模式之中介者模式

中介者模式(Mediator),其含義是用一箇中介對象來封裝一系列的對象交互。中介者使個對象不須要顯示地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互。面向對象的設計原則鼓勵將行爲分佈到各個對象中去,這種分佈可能會致使對象間有許多的鏈接,在最壞的狀況下,每個對象都其餘對象,都和其餘對象有聯繫。但這樣下降了複用性。  

 能夠經過一個將集體行爲封裝在一個單獨的中介者對象中以免這個問題。中介者負責控制和協調一組對象間的交互。使得對象間的不在相互顯示引用,減小了不少的鏈接數目。它們之間不須要知道相互的信息,僅僅須要知道這個中間人就能夠了。如你們在聊天室裏聊天,不用管對方是誰,直接登入聊天時就能夠了。ide

其適用性:測試

一組對象以定義良好可是複雜的方式進行通訊。產生的相互依賴關係結構混亂且難以理解,this

一個對象引用其餘不少對象而且直接與這些對象通訊,致使難以複用該對象, spa

想定製一個分佈在多個類中的行爲,而又不想生成太多的子類。設計

其結構圖:code

          

每個同事類都知道它的中介者對象,每個同事在須要與其餘同事通訊的時候,與它的中介者通訊。中介者再轉發請求以實現協做行爲。在設計Colleague-Mediator之間的通訊時,可使用Observer模式,將Mediator實現爲一個Observer,各Colleague做爲Subject,一旦其狀態改變就發送通知個Mediator,Mediator作出的響應是將狀態改變的結果傳播給其餘的Colleague。另外一種方式就是在Mediator中定義一個特殊的通知接口,各Colleague在通訊時直接調用該接口。server

 本人實現的較爲簡單,以下:對象

  package  org.designpattern.behavioral.mediator;
public  abstract  class Colleage {
     protected String message;
     protected Mediator mediator;
     public   abstract   void action();

     public Mediator getMediator() {
         return mediator;
    }

     public  void setMediator(Mediator mediator) {
         this.mediator = mediator;
    }

     public String getMessage() {
         return message;
    }

     public  void setMessage(String message) {
         this.message = message;
    }
}

具體的同事類以下,都較爲簡單,在此列舉一個:blog

package  org.designpattern.behavioral.mediator;
public  class ConcreteColleageA  extends Colleage {
    @Override
     public  void action() {
         // To change body of implemented methods use File | Settings | File Templates.
         this.getMediator().doActionFromA2B();
    }

} 繼承

  中介者抽象接口有兩個抽象方法:

package  org.designpattern.behavioral.mediator;
public  abstract  class Mediator {
     public  abstract  void doActionFromA2B();
     public  abstract   void doActionFromB2A();

} 

  在使用時具體的中介者來實現該接口方法:

package  org.designpattern.behavioral.mediator;
public  class ConcreteMediator  extends Mediator {
     private Colleage colleageA;
     private Colleage colleageB;
     public ConcreteMediator(Colleage A,Colleage B){
         this.colleageA = A;
         this.colleageB = B;
    }
    @Override
     public  void doActionFromA2B() {
         // To change body of implemented methods use File | Settings | File Templates.
         this.colleageB.setMessage( this.colleageA.getMessage());
    }

    @Override
     public  void doActionFromB2A() {
         // To change body of implemented methods use File | Settings | File Templates.
         this.colleageA.setMessage( this.colleageB.getMessage());
    }

} 

  本文的實現方式是將兩個同事類的message,更改成本身的message信息,在客戶段測試類能夠直接顯示出來:

package  org.designpattern.behavioral.mediator;
public  class Main {
     public  static  void main(String[] args) {
        ConcreteColleageA a =  new ConcreteColleageA();
        ConcreteColleageB b =  new ConcreteColleageB();

        Mediator mediator =  new ConcreteMediator(a,b);
        a.setMediator(mediator);
        b.setMediator(mediator);

        a.setMessage("send message to colleageB");
        a.action();
        System.out.println(a.getMessage());
        System.out.println(b.getMessage());

        b.setMessage("send message to colleageA");
        b.action();
        System.out.println(a.getMessage());
        System.out.println(b.getMessage());
    }

} 

  適當使用調停者模式能夠較少適用靜態的繼承關係,使得具體同事類能夠更加容易地被複用;還能夠避免同事對象之間的國度耦合,使得條挺累與同事類能夠相對獨立地演化;其將多對多的相互做用轉化爲一對多的相互做用,使得對象之間的關係更加易於維護和理解。其與Facade模式的不一樣在於Facade意在簡化接口,其實單向的,而Mediator是具備多向的協議協做行爲。

相關文章
相關標籤/搜索