java设计模式之中介者模式

    Mediator模式也叫中介者模式,是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用。中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。

使用场景: 
    当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及很多其他对象的行为,可使用中介者模式。

要解决:

    对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

应用实例:

     1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。

     2、机场调度系统。

    3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

中介者模式的UML模型:


角色和职责:

    (1)Mediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。

    (2)ConcreteMediator:具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接受消息,向具体同事对象发出命令。

    (3)Colleague:抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。

    (4)ConcreteColleague1、ConcreteColleague2:具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围的行为,而不知道在大范围内的目的。

代码示例:

/**
 * 定义中介者抽象类
 * @author arain.liu
 * 2018年4月3日 下午7:50:59
 */
public abstract class Mediator {
  protected ConcreteColleagueA colleagueA;
  protected ConcreteColleagueB colleagueB;
  
  public ConcreteColleagueA getColleagueA() {
    return colleagueA;
  }
  public void setColleagueA(ConcreteColleagueA colleagueA) {
    this.colleagueA = colleagueA;
  }
  public ConcreteColleagueB getColleagueB() {
    return colleagueB;
  }
  public void setColleagueB(ConcreteColleagueB colleagueB) {
    this.colleagueB = colleagueB;
  }
  
  public abstract void do_workA();
  public abstract void do_workB();
}

/**
 * 定义中介者实现类
 * @author arain.liu
 * 2018年4月3日 下午7:52:04
 */
public class ConcreteMediator extends Mediator {

  @Override
  public void do_workA() {
    System.out.println("ConcreteMediator执行do_workA");
    super.colleagueA.doMethod1();
    super.colleagueB.doMethod1();
  }

  @Override
  public void do_workB() {
    System.out.println("ConcreteMediator执行do_workB");
    super.colleagueA.doMethod1();
    super.colleagueB.doMethod1();
  }

}

/**
 * 抽象同事类
 * @author arain.liu
 * 2018年4月3日 下午7:54:28
 */
public abstract class Colleague {
  protected Mediator mediator;
  
  public Colleague(Mediator mediator){
    this.mediator = mediator;
  }
  
  public abstract void doMethod1();
  public abstract void doMethod2();
}

/**
 * @author arain.liu
 * 2018年4月3日 下午7:55:15
 */
public class ConcreteColleagueA extends Colleague {

  public ConcreteColleagueA(Mediator mediator) {
    super(mediator);
  }

  @Override
  public void doMethod1() {
    System.out.println("ConcreteColleagueA执行method1--");
  }

  @Override
  public void doMethod2() {
    System.out.println("ConcreteColleagueA执行method2--");
    super.mediator.do_workA();
  }
}
/**
 * @author arain.liu
 * 2018年4月3日 下午7:55:47
 */
public class ConcreteColleagueB extends Colleague {

  public ConcreteColleagueB(Mediator mediator) {
    super(mediator);
  }

  @Override
  public void doMethod1() {
    System.out.println("ConcreteColleagueB执行method1***");
  }

  @Override
  public void doMethod2() {
    System.out.println("ConcreteColleagueB执行method2***");
    super.mediator.do_workB();
  }
}

/**
 * @author arain.liu
 * 2018年4月3日 下午8:13:40
 */
public class MainClass {

  public static void main(String[] args) {
    Mediator mediator = new ConcreteMediator();
    ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
    ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
    
    mediator.setColleagueA(colleagueA);
    mediator.setColleagueB(colleagueB);
    
    System.out.println("**************************");
    colleagueA.doMethod1();
    System.out.println("**************************");
    colleagueA.doMethod2();
    System.out.println("**************************");
    colleagueB.doMethod1();
    System.out.println("**************************");
    colleagueB.doMethod2();
  }
}

运行结果:


中介者模式的优缺点:

 优点:

    (1)将系统按功能分割成更小的对象,符合类的最小设计原则
    (2)对关联对象的集中控制
    (3)减小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,不符合类的设计的开闭原则 ,而Mediator模式将原来相互依存的多对多的类之间的关系简化为Mediator控制类与其他关联类的一对多的关系,当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在Mediator控制类)。

    (4)有利于提高类的重用性

 缺点:

    中介者会庞大,变得复杂难以维护。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值