Java设计模式--中介者模式(Mediator)

概述


  • 如果在一个系统中对象之间的联系呈现为网状结构。对象之间存在大量的多对多联系,将导致系统非常复杂,这些对象既会影响别的对象,也会被别的对象所影响,这些对象称为同事对象。
  • 中介者模式可以使对象之间的关系数量急剧减少,通过引入中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构。在这个星形结构中,同事对象不再直接与另一个对象联系,它通过中介者对象与另一个对象发生相互作用。中介者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为新对象的引入带来大量的修改工作。
  • 如果在一个系统中对象之间存在多对多的相互关系,我们可以将对象之间的一些交互行为从各个对象中分离出来,并集中封装在一个中介者对象中,并由该中介者进行统一协调,这样对象之间多对多的复杂关系就转化为相对简单的一对多关系。通过引入中介者来简化对象之间的复杂交互,中介者模式是“迪米特法则”的一个典型应用。
  • 定义:用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  • 中介者模式又称为调停者模式。
  • 是一种对象行为型模式。
  • 学习难度:★★★☆☆
  • 使用频率:★★☆☆☆

优缺点


  • 优点
    • 中介者对象使各对象不用显式的相互作用,从而使其耦合松散,而且可以独立改变他们之间的交互
    • 减少依赖,耦合松散
  • 缺点
    • 伴随着同事角色增多,中介者业务会膨胀的很大

类图


在这里插入图片描述

组成角色


  • 抽象中介者角色(Mediator)
  • 具体中介者角色(ConcreteMediator)
  • 同事角色(Colleague)
  • 具体同事角色(ConcreteColleague)

Code Example


抽象中介者角色(Mediator)
  • 定义接口,处理同事角色间的通信
/**
 * 抽象调停者角色
 * 
 * @author yanbin
 * 
 */
public interface Mediator {

   public void sendMsg(String message, Colleague colleague);

}
具体中介者角色(ConcreteMediator)
  • 依赖各同事角色,处理各同事角色间的协作行为
/**
 * 具体调停者角色
 *
 * @author yanbin
 * @version 2018/5/15 14:44
 *
 **/
public class ConcreteMediator implements Mediator {

   private Colleague colleagueA;
   private Colleague colleagueB;

   public ConcreteMediator(Colleague colleagueA, Colleague colleagueB) {
      this.colleagueA = colleagueA;
      this.colleagueB = colleagueB;
   }

   @Override
   public void sendMsg(String message, Colleague colleague) {
      if (colleagueA == colleague) {
         colleagueB.notify(message);
      } else if (colleagueB == colleague) {
         colleagueA.notify(message);
      }
   }

}
同事角色(Colleague)
  • 每个同事角色都知道中介者角色
  • 包含自有方法,只处理内部的逻辑的方法
  • 依赖方法,依赖中介者处理逻辑的方法
/**
 * 抽象同事角色
 * 
 * @author yanbin
 * 
 */
public abstract class Colleague {

   private Mediator mediator;

   public Mediator getMediator() {
      return mediator;
   }

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

   public abstract void sendMsg();

   public abstract void notify(String message);

}
具体同事角色(ConcreteColleague)
public class ConcreteColleagueA extends Colleague {

   public void sendMsg() {
      getMediator().sendMsg("通知B,想揍他", this);
   }

   public void notify(String message) {
      System.out.println("A接受到通知:" + message);
   }

}
public class ConcreteColleagueB extends Colleague {

   public void sendMsg() {
      getMediator().sendMsg("通知A,有问题", this);
   }

   public void notify(String message) {
      System.out.println("B接受到通知:" + message);
   }

}
客户端
/**
 * 调停者模式(中介者模式):用一个调停对象来封装一系列的对象交互。 <br>
 * 组成:抽象调停者(Mediator)角色;具体调停者(Concrete Mediator)角色;<br>
 * 同事(Colleague)角色;具体同事角色(ConcreteColleague)<br>
 * 调停者模式的作用便是将关系错乱复 杂、层次不清晰的对象群分割成两层或者三层。<br>
 * 结构上和观察者模式、命令模式十分相像;而应用目的又与结构模式“门面模式”有些相似。
 * 
 * @author yanbin
 * 
 */
public class MediatorPattern {

   public static void main(String[] args) {
      Colleague colleagueA = new ConcreteColleagueA();
      Colleague colleagueB = new ConcreteColleagueB();
      Mediator mediator = new ConcreteMediator(colleagueA, colleagueB);
      colleagueA.setMediator(mediator);
      colleagueB.setMediator(mediator);

      colleagueA.sendMsg();
      colleagueB.sendMsg();
   }

}

猜你喜欢

转载自blog.csdn.net/yanbin0830/article/details/89319644