定义

中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

UML图描述

中介者模式主要包含四种角色:

  1. 抽象中介类角色:如下图的Mediator
  2. 具体中介类角色:如下图的ConcreteMediator
  3. 抽象同事类角色:如下图的Colleague
  4. 具体同事类角色:如下图的ConcreteColleague1,ConcreteColleague2

中介者模式

代码实现

/**
 * 抽象中介类
 */
public abstract class Mediator {
    protected List<Colleague> colleagues;

    public Mediator(){
        colleagues = new ArrayList<>();
    }

    public void register(Colleague colleague){
        colleagues.add(colleague);
        colleague.setMediator(this);
    }

    public abstract void behavior(Colleague colleague,String msg);
}
/**
 * 具体中介类
 */
public class ConcreteMediator extends Mediator{
    @Override
    public void behavior(Colleague colleague, String msg) {
        if(colleagues.contains(colleague)){
            colleague.receiveMsg(msg);
        }else{
            System.out.println("该对象不在中介类可联系的范围");
        }
    }
}
/**
 * 抽象同事类
 */
public abstract class Colleague {

    protected Mediator mediator;

    public void receiveMsg(String str){
        System.out.println(str);
    }

    public abstract void sendMsg(Colleague colleague,String str);

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }
}
/**
 * 具体同事类1
 */
public class ConcreteColleague1 extends Colleague {
    @Override
    public void sendMsg(Colleague colleague, String str) {
        this.mediator.behavior(colleague,str);
    }
}
/**
 * 具体同事类2
 */
public class ConcreteColleague2 extends Colleague {
    @Override
    public void sendMsg(Colleague colleague, String str) {
        this.mediator.behavior(colleague,str);
    }
}
/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();

        Colleague colleague1 = new ConcreteColleague1();
        Colleague colleague2 = new ConcreteColleague2();

        mediator.register(colleague1);
        mediator.register(colleague2);

        colleague1.sendMsg(colleague2,"你好,这是colleague1发来的打招呼信息");
        colleague1.sendMsg(colleague1,"你好,这是colleague2发来的打招呼信息");
    }
}

适用场景

1.系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
2.想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象。
3.交互的公共行为,如果需要改变行为则可以增加新的中介者类。

中介者模式的优点

1.简化了对象之间的交互。
2.将各同事解耦。
3.减少子类生成。
4.可以简化各同事类的设计和实现。

中介者模式的缺点

1.在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。

完整的工程代码链接:https://github.com/youzhihua/design-pattern