概念

  • 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,减少对象间混乱的依赖关系,从而使其耦合松散,而且可以独立地改变它们之间的交互。对象行为型模式
  • image.png
  • image.png

主要角色

  • Mediator: 抽象中介者
  • ConcreteMediator: 具体中介者
  • Colleague: 抽象同事类
  • ConcreteColleague: 具体同事类
  1. /**
  2. * Colleague: 抽象同事类
  3. */
  4. public abstract class Captain {
  5. //起飞
  6. abstract void fly();
  7. //降落
  8. abstract void land();
  9. //完成
  10. abstract void success();
  11. }
/**
 * ConcreteColleague: 具体同事类
 */
public class SC8633 extends Captain {
    ControlTower controlTower;

    public void setControlTower(ControlTower controlTower) {
        this.controlTower = controlTower;
    }

    @Override
    void fly() {
        System.out.println("SC8633 请求起飞......");
        //问每个机长能否起飞?
        controlTower.acceptRequest(this, "fly");

    }

    @Override
    void land() {

        System.out.println("SC8633 请求降落......");
        //问每个机长能否起飞?
        controlTower.acceptRequest(this, ";land");
    }

    @Override
    void success() {

        System.out.println("SC8633 完成......");
        //问每个机长能否起飞?
        controlTower.acceptRequest(this, "fly");
    }
}
/**
 * ConcreteColleague: 具体同事类
 */
public class HU8778 extends Captain{

    ControlTower controlTower;

    public void setControlTower(ControlTower controlTower) {
        this.controlTower = controlTower;
    }

    @Override
    void fly() {
        System.out.println("HU8778请求起飞......");
        //问每个机长能否起飞?
        controlTower.acceptRequest(this,"fly");
    }

    @Override
    void land() {
        System.out.println("HU8778请求降落......");
        controlTower.acceptRequest(this,"land");
    }

    @Override
    void success() {
        System.out.println("完成......");
        controlTower.acceptRequest(this,"success");
    }
}
/**
 * ConcreteMediator: 具体中介者
 */
public class ControlTower {


    private boolean canDo = true;

    //接受请求...
    public void acceptRequest(Captain captain,String action){
        if("fly".equals(action)||"land".equals(action)){
            //
            if(canDo == true){
                System.out.println("允许......");
                canDo = false;
            }else {
                System.out.println("不允许.....");
            }
        }
        if("success".equals(action)){
            canDo = true;
        }


    }
}

应用场景

  • SpringMVC 的 DispatcherServlet是一个中介者,他会提取Controller、Model、View来进行调用。而无需controller直接调用view之类的渲染方法
  • 分布式系统中的网关
  • 迪米特法则的一个典型应用
  • 中介者和外观(门面)模式区别?
    • 中介者双向操作,门面偏向于封装某一方