中介者模式(Mediator Pattern)又叫作调解者模式或调停者模式。用一个中介对象封装一系列对象交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互,属于行为型设计模式。

    把网状机构简化成星型结构,通过一个中介类把系统各层次对象间多对多关系变成一对多关系。
    通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信全部交由中介者转发

    image.png

    • 抽象中介者
    • 具体中介者
    • 抽象同事类
    • 具体同事类

    一般来说,由于不同的具体同事类一般处理不同的业务,很难抽象出共性,因此在抽象中介者类里直接引用具体同事类,抽象同事类一般可以忽略

    框架
    JDK中的Timer

    优点

    • 减少类间依赖,多对多依赖转化为一对多,降低复杂性和耦合性
    • 同事类各司其职

    缺点

    • 同事类变多,中介类难以维护 ``` public abstract class Colleague {

      protected Mediator mediator;

      public Colleague(Mediator mediator) {

      1. this.mediator = mediator;

      } } public class ConcreteColleagueA extends Colleague { public ConcreteColleagueA(Mediator mediator) {

        super(mediator);
        mediator.setConcreteColleagueA(this);
      

      }

      public void selfMethodA(){

        System.out.println("自发行为A");
      

      }

      public void depMethodA(){

        System.out.println("依赖行为A");
        this.mediator.transferA();
      

      } } public class ConcreteColleagueB extends Colleague { public ConcreteColleagueB(Mediator mediator) {

        super(mediator);
        mediator.setConcreteColleagueB(this);
      

      }

      public void selfMethodB(){

        System.out.println("自发行为B");
      

      }

      public void depMethodB(){

        System.out.println("依赖行为B");
        this.mediator.transferB();
      

      } }

    public abstract class Mediator {

    protected ConcreteColleagueA concreteColleagueA;
    protected ConcreteColleagueB concreteColleagueB;
    
    public void setConcreteColleagueA(ConcreteColleagueA concreteColleagueA) {
        this.concreteColleagueA = concreteColleagueA;
    }
    
    public void setConcreteColleagueB(ConcreteColleagueB concreteColleagueB) {
        this.concreteColleagueB = concreteColleagueB;
    }
    
    public abstract void transferA();
    
    public abstract void transferB();
    

    } public class ConcreteMediator extends Mediator {

    @Override
    public void transferA() {
        this.concreteColleagueB.selfMethodB();
    }
    
    @Override
    public void transferB() {
        this.concreteColleagueA.selfMethodA();
    }
    

    }

    ```