美文网首页
<<设计模式之禅(第二版)>>——第十四

<<设计模式之禅(第二版)>>——第十四

作者: leiiiooo | 来源:发表于2016-10-15 23:30 被阅读9次
定义:
  • 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地互相作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
常用类图:
中介者模式通用类图
 /*
 * 定义抽象的中介者类
 * 如果每个具体的同事实现类,有各自特有的方法,那么注入的时候
 * 应该使用的是同事实现类进行注入,如果每个同事类都有相同的方法,
 * 那么应该使用抽象注入,做到依赖倒置原则
 * */
public abstract class Mediator {
  // 注入具体的同事类
  ConcreteColleagueOne concreteColleagueOne;
  ConcreteColleagueTwo concreteColleagueTwo;

  public ConcreteColleagueOne getConcreteColleagueOne() {
    return concreteColleagueOne;
  }

  public void setConcreteColleagueOne(ConcreteColleagueOne concreteColleagueOne) {
    this.concreteColleagueOne = concreteColleagueOne;
  }

  public ConcreteColleagueTwo getConcreteColleagueTwo() {
    return concreteColleagueTwo;
  }

  public void setConcreteColleagueTwo(ConcreteColleagueTwo concreteColleagueTwo) {
    this.concreteColleagueTwo = concreteColleagueTwo;
  }

  // 中介者处理事务的抽象逻辑
  abstract void doSomethinOne();

  abstract void doSomethinTwo();

  abstract void doSomethinThree();

  abstract void doSomethinFour();

}
public class ConcreteMediator extends Mediator {

  @Override
  void doSomethinOne() {
    super.concreteColleagueOne.ownMethod();
    super.concreteColleagueTwo.ownMethod();

  }

  @Override
  void doSomethinTwo() {
    // TODO Auto-generated method stub

  }

  @Override
  void doSomethinThree() {
    // TODO Auto-generated method stub

  }

  @Override
  void doSomethinFour() {
    // TODO Auto-generated method stub

  }

}
/*
 * 抽象的同事类,注入中介者
 * */
public abstract class Colleague {
protected Mediator mediator;

public Colleague(Mediator mediator) {
    this.mediator = mediator;
}
}
public class ConcreteColleagueOne extends Colleague {

public ConcreteColleagueOne(Mediator mediator) {
    super(mediator);
    // TODO Auto-generated constructor stub
}

// 定义自己的方法
public void ownMethod() {
    // 自己的业务逻辑
}

// 定义依赖的方法
public void depMethod(){
    //自己的业务逻辑
    super.mediator.doSomethinThree();
}
}

public class ConcreteColleagueTwo extends Colleague {

  public ConcreteColleagueTwo(Mediator mediator) {
    super(mediator);
    // TODO Auto-generated constructor stub
  }

  // 定义自己的方法
  public void ownMethod() {
    // 自己的业务逻辑
  }

  // 定义依赖的方法
  public void depMethod() {
    // 自己的业务逻辑
    super.mediator.doSomethinFour();
  }

}
缺点:
  • 中介者会体积膨胀得很大,而且逻辑复杂,原本N个对象直接的依赖关系转换为中介者和同事类的依赖关系,同事越多中介者的逻辑就越复杂。
最佳实践:
  • 中介者模式很少使用到接口或者抽象类,这与依赖倒置原则是冲突的,主要是类之间是协作关系,完成不同的事情,处理不同的任务,同事关系,不适合抽取父类,统一定义同事所必须有的方法。

相关文章

网友评论

      本文标题:<<设计模式之禅(第二版)>>——第十四

      本文链接:https://www.haomeiwen.com/subject/ckjoyttx.html