设计模式之中介者模式

中介者模式(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是具备多向的协议协做行为。

相关文章
相关标签/搜索