中介者模式

        用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

Mediator Pattern

       Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.

 

中介者模式的结构中包括四种角色

  • 中介者(Mediator):中介者是一个接口,该接口定义了用于同事(Colleague)对象之间进行通信的方法。
  • 具体中介者(ConcreteMediator):具体中介者是实现中介者接口的类。具体中介者需要包含所有具体同事(ConcreteColleague)的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信请求。
  • 同事(Colleague):一个接口,规定了具体同事需要实现的方法。
  • 具体同事(ConcreteColleague):实现同事接口的类。具体同事需要包含具体中介者的引用,一个具体同事需要和其他具体同事交互时,只需将自己的请求通知给它所包含的具体中介者即可。

中介者模式的类图

   

中介者模式学习笔记 

中介者模式的优点

  • 可以避免许多的对象为了之间的通信而相互显示的引用,否则,不仅系统难于维护,而且也使其他系统难以复用这些对象。
  • 可以通过中介者将原本分布于多个对象之间的交互行为集中在一起。当这些对象之间需要改变之间的通信行为时,只需使用一个具体中介者即可,不必修改各个具体同事的代码,即这些同事可被重用。
  • 具体中介者使得各个具体同事完全解耦,修改任何一个具体同事的代码不会影响到其他同事。
  • 具体中介者集中了同事之间是如何交互的细节,使系统比较清楚地知道整个系统中的同事是如何交互的。
  • 当一些对象相互通信,但又无法相互包含对方的引用,那么使用中介者模式就可以使这些对象相互通信。

      注:由于中介者集中了同事之间是如何交互的细节,可能使具体中介者变得非常复杂,增加了维护的难度。

适合中介者模式使用的情景

  • 许多对象以复杂的方式交互,所导致的依赖关系使系统难以理解和维护。
  • 一个对象引用其他很多对象,导致难以复用该对象。

中介者模式应用实例

      古代相互交战的A,B,C三方想通过一个中介者调停之间的战火。A方委托调停者  传达的信息是:"要求B方归还曾抢夺的100斤土豆,要求C方归还曾抢夺的20头牛";B方委托调停者传达的信息是:"要求A方归还曾抢夺的10只公鸡,要求C方 归还曾抢夺的15匹马";C方委托调停者传达的信息是:要求A方归还曾抢夺的300斤小麦,要求B方归还曾抢夺的50头驴;

1.同事(Colleague)

本问题中,同事接口是Colleague,定义了具体同事,即交战各方需要实现的方法。Colleague接口的代码实现如下:

/*
 * 同事接口,定义了具体同事,即交战各方需要实现的方法
 */
public interface Colleague
{
           public void giveMess(String[] mess);
 
           public void receiverMess(String mess);
 
           public void setName(String name);
 
           public String getName();
 
}
2.中介者(Mediator)

/*
 * 中介者接口
 */
public interface Mediator {
 
           public void deliverMess(Colleague collague,String[] mess);

}

3.具体中介者

//具体中介者
public class ConcreteMediator implements Mediator{
 
         CollagueA colleagueA;
         CollagueB colleagueB;
         CollagueC colleagueC;
 
 public void registerColleagueA(CollagueA colleagueA)
 {
         this.colleagueA = colleagueA;
 }
 
 public void registerColleagueB(CollagueB colleagueB)
 {
         this.colleagueB = colleagueB;
 }
 
 public void registerColleagueC(CollagueC colleagueC)
 {
         this.colleagueC = colleagueC;
 }
 
    public void deliverMess(Colleague colleague,String[] mess)
    {
            if(colleague == colleagueA)
             {
                     if(mess.length >= 2)
                    {
                          colleagueB.receiverMess(colleague.getName()+mess[0]);
                          colleagueC.receiverMess(colleague.getName()+mess[1]);
                    }
             }
     
           if(colleague == colleagueB)
            {
                    if(mess.length >= 2)
                       {
                            colleagueA.receiverMess(colleague.getName()+mess[0]);
                            colleagueC.receiverMess(colleague.getName()+mess[1]);
                       }
            }
     
            if(colleague == colleagueC)
             {
                    if(mess.length >= 2)
                     {
                           colleagueA.receiverMess(colleague.getName()+mess[0]);
                           colleagueB.receiverMess(colleague.getName()+mess[1]);
                     }
             }
    }
    
 
}

4.具体同事

ColleagueA.java

/*
 * 具体同事
 */

public class CollagueA implements Colleague {


         ConcreteMediator mediator;
         String name;
 
 CollagueA(ConcreteMediator mediator)
 {
         this.mediator = mediator;
         mediator.registerColleagueA(this);
 }

 @Override
 public void giveMess(String[] mess) {
  
         mediator.deliverMess(this,mess);
   
 }

 @Override
 public void receiverMess(String mess) {
  
        System.out.println(name+"收到的消息是:");
        System.out.println(mess);

 }

 @Override
 public void setName(String name) {
  
        this.name = name;
 }

 @Override
 public String getName() {
  
       return name;
 }

}

ColleagueB.java

/*
 * 具体同事
 */
public class CollagueB implements Colleague{
 
        ConcreteMediator mediator;
        String name;
 
 CollagueB(ConcreteMediator mediator)
 {
        this.mediator = mediator;
        mediator.registerColleagueB(this);
 }

 public void receiverMess(String mess) {
  
         System.out.println(name+"收到的信息是:");
         System.out.println(mess);
 }

 @Override
 public void giveMess(String[] mess) {
  
        mediator.deliverMess(this, mess);
  
 }

 @Override
 public void setName(String name) {
  
        this.name = name;
 }

 @Override
 public String getName() {
  
       return name;
 }

}

ColleagueC.java

/*
 * 具体同事
 */

public class CollagueC implements Colleague{
 
        ConcreteMediator mediator;
        String name;
 
 public CollagueC(ConcreteMediator mediator)
 {
          this.mediator = mediator;
          mediator.registerColleagueC(this);
 }
    @Override
 public void receiverMess(String mess) {
  
         System.out.println(name+"收到的消息是:");
         System.out.println(mess);
 }

 @Override
 public void giveMess(String[] mess) {
  
        mediator.deliverMess(this, mess);
  
 }

 @Override
   public void setName(String name) {
  
         this.name = name;
  
 }

 @Override
 public String getName() {
  
        return name;
 }

}

5.模式的使用

public class Application {

 public static void main(String[] args) {
 
           ConcreteMediator mediator = new ConcreteMediator();
           CollagueA collagueA = new CollagueA(mediator);
           CollagueB collagueB = new CollagueB(mediator);
           CollagueC collagueC = new CollagueC(mediator);
       
           collagueA.setName("中国");
           collagueB.setName("美国");
           collagueC.setName("日本");
      
           String[] messA = {"要求归还曾抢夺的100斤土豆","要求归还曾抢夺的20头牛"};
           collagueA.giveMess(messA);
      
           String[] messB = {"要求归还曾抢夺的10只公鸡","要求归还曾抢夺的15匹马"};
           collagueB.giveMess(messB);
      
           String[] messC = {"要求归还曾抢夺的300斤小麦","要求归还曾抢夺的50头驴"};
           collagueC.giveMess(messC);
        
       }
      
      
 }

6.运行结果

        美国收到的信息是:
        中国要求归还曾抢夺的100斤土豆
        日本收到的消息是:
        中国要求归还曾抢夺的20头牛
        中国收到的消息是:
        美国要求归还曾抢夺的10只公鸡
        日本收到的消息是:
        美国要求归还曾抢夺的15匹马
        中国收到的消息是:
        日本要求归还曾抢夺的300斤小麦
        美国收到的信息是:
        日本要求归还曾抢夺的50头驴

 

转载于:https://blog.51cto.com/chenyi2013/1189880

相关文章:

  • 2021-05-31
  • 2021-05-07
  • 2021-07-10
  • 2021-10-11
  • 2021-06-22
  • 2022-02-21
  • 2018-08-26
猜你喜欢
  • 2021-11-22
  • 2021-11-30
  • 2021-09-22
  • 2021-05-24
  • 2021-11-22
相关资源
相似解决方案