中介者模式

喜夏-厌秋 提交于 2021-02-18 10:50:45

1.1 中介者

1.1.1 定义

中介者模式 (Mediator Pattern) 也称为调解者模式或调停者模式,Mediator 本身就有调停者和调解者的意思。在日常生活中调停者或调解者这个角色我们见得比较多的是 ”和事佬“,也就是说调解两个有争端的人的角色。中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使他们可以松散偶合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可以彼此独立变化。中介者模式将多对多的相互作用转化为一对多的相互作用,将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

1.1.2 角色

  • UML
  • Mediator: 抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。
  • ConcreteMediator: 具体中介者角色,继承于抽象中介者,实现了父类定义的方法,它从具体的同事对象接收消息,向具体同事对象发出命令。
  • Colleague: 抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其它的同事对象。
  • ConcreteColleagueA/B: 具体同事类角色,继承于抽象同事类,每个具体同事类都知道本身在小范围内的行为,而不知道它在大范围内的目的。

1.1.3 代码

public class Demo {
    public static void main(String[] args) {
        ConcreteMediator concreteMediator = new ConcreteMediator();
        ColleagueA colleagueA = new ColleagueA("A", concreteMediator);
        ColleagueB colleagueB = new ColleagueB("B", concreteMediator);
        concreteMediator.setColleagueA(colleagueA);
        concreteMediator.setColleagueB(colleagueB);
        colleagueA.contact(" 我是A,我要联系B!");
        colleagueB.contact(" 我是B,收到A消息!");
    }
}


/**
 * 抽象中介者
 */
abstract class Mediator {

    public abstract void notice(String content, Colleague colleague);

}

/**
 * 抽象同事
 */
abstract class Colleague {
    protected String name;
    protected Mediator mediator;

    public Colleague(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}

/**
 * 具体同事类继承自Colleague,此刻就可以与中介者mediator进行通信了
 */
class ColleagueA extends Colleague {

    public ColleagueA(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 同事A与中介者通信
     *
     * @param message 信息
     */
    public void contact(String message) {
        mediator.notice(message, this);
    }

    public void getNotice(String message) {
        System.out.println(name + "获得信息:" + message);
    }
}

class ColleagueB extends Colleague {

    public ColleagueB(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 同事B与中介者通信
     *
     * @param message 信息
     */
    public void contact(String message) {
        mediator.notice(message, this);
    }

    public void getNotice(String message) {
        System.out.println(name + "获得信息:" + message);
    }
}

/**
 * 定义具体中介者ConcreteMediator,具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。
 */
class ConcreteMediator extends Mediator {

    ColleagueA colleagueA;
    ColleagueB colleagueB;

    public ConcreteMediator() {
    }

    public ConcreteMediator(ColleagueA colleagueA, ColleagueB colleagueB) {
        this.colleagueA = colleagueA;
        this.colleagueB = colleagueB;
    }

    public ColleagueA getColleagueA() {
        return colleagueA;
    }

    public void setColleagueA(ColleagueA colleagueA) {
        this.colleagueA = colleagueA;
    }

    public ColleagueB getColleagueB() {
        return colleagueB;
    }

    public void setColleagueB(ColleagueB colleagueB) {
        this.colleagueB = colleagueB;
    }

    @Override
    public void notice(String content, Colleague colleague) {
        if (colleague == colleagueA) {
            colleagueB.getNotice(content);
        } else {
            colleagueA.getNotice(content);
        }
    }
}

1.1.4 特点

  • 中介者模式简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。并且提供系统的灵活性,使得各个同事对象独立而易于复用。
  • 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

1.1.5 应用场景

  • 在现实生活中,有很多中介者模式的身影,例如二手车平台、婚姻中介和房产中介,通过平台方介入进行协调供需之间的关系。
  • 当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。当想创建一个运行于多个类之间的对象,又不想生成新的子类时。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!