JAVA设计模式之中介者模式

162 阅读3分钟

本文介绍23种设计模式之中介者模式。

定义

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。使用中介者模式来集中相关对象之间复杂的沟通和控制方式。

描述

  • 模式名称:MEDIATOR(中介者)
  • 类型:对象行为型模式
  • 意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
  • 适用性:
    • 一组对象已定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
    • 一个对象引用其他很多对象并且直接与这些对象通信 ,导致难以复用该对象。
  • 效果:
  • 优点:
    • 减少了子类生成。Mediator将原本分布于多个对象间的行为集中在一起。改变这些行为只需生成Meditator的子类即可。
    • 将各Colleague解耦。
    • 使控制集中化。
  • 缺点:
    • 中介者会庞大,变得复杂难以维护。

类图

没有使用中介者模式

对象间相互引用,不利于扩展和维护 image.png

使用中介者模式

每个对象只和中介者交互,从而达到了解耦。

image.png

类图

  1. 抽象中介者(Mediator)角色:它是中介者的抽象类,提供了同事对象注册与转发同事对象信息的抽象方法。
  2. 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  3. 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  4. 具体同事类(ConcreteColleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

image.png

实现代码

Mediator


public abstract class Mediator {
    protected List<Colleague> list;

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

    public void setColleague(Colleague colleague) {
        list.add(colleague);
        colleague.setMediator(this);
    }

    abstract void relay(Colleague colleague);
}

ConcreteMediator

public class ConcreteMediator extends Mediator {
    @Override
    void relay(Colleague colleague) {
        colleague.receive();
    }
}

Colleague

public abstract class Colleague {
    protected Mediator mediator;

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    abstract void send();
    abstract void receive();
}

ConcreteColleague

public class ConcreteColleague extends Colleague {



    @Override
    void send() {
        System.out.println("send");
        mediator.relay(this);
    }

    @Override
    void receive() {
        System.out.println("receive");
    }
}

优缺点

  • 优点
    • 通过将对象彼此解耦,可以增加对象的复用性.
    • 通过将控制逻辑集中,便于系统维护.
    • 可以让对象之间所传递的消息变得简单而且大幅减少.
  • 缺点
    • 如果设计不当,中介者本身会变得过于复杂,就像mvc模式中controller的代码可能会过于庞大一样.