JAVA设计模式19:中介者模式,引入中介者对象来解耦一组对象之间的关系

2023-11-03 09:41:41 浏览数 (1)

作者主页:Designer 小郑 作者简介:3年JAVA全栈开发经验,专注JAVA技术、系统定制、远程指导,致力于企业数字化转型,CSDN博客专家,阿里云社区专家博主,蓝桥云课讲师。


一、什么是中介者模式

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个中介者对象来解耦一组对象之间的关系

中介者模式的核心思想是将对象之间的通信行为集中在一个中介者对象中,而不是让对象直接相互引用,通过这种方式,可以降低对象之间的耦合性,使系统更加灵活和可扩展。

在中介者模式中,中介者对象拥有对一组相关对象的引用,并负责协调和管理它们之间的交互。当一个对象发生变化时,它不需要直接通知其他相关对象,而是将变化信息传递给中介者对象,由中介者对象负责将信息传递给其他相关对象。这样,对象之间的通信变得简单明了,并且不需要了解彼此的细节。

中介者模式适用于多个对象之间存在复杂的交互关系的场景,当对象之间的交互行为变得复杂且难以维护时,可以考虑使用中介者模式来简化系统结构。常见的应用场景包括GUI程序中的窗口管理器、飞机调度系统、聊天室等。

中介者模式的优点包括减少了对象之间的直接依赖,将对象之间的交互行为集中在一个中介者对象中,使系统易于维护和扩展。然而中介者模式也有一些缺点,例如中介者对象可能会变得过于复杂,同时也会增加系统的复杂性

总之,中介者模式通过引入中介者对象来降低对象之间的耦合性,使系统更加灵活和可扩展,它是一种强大的设计模式,可以用于解决复杂交互关系的问题。


二、中介者模式实例

以下是一个简单的 Java 中介者模式的示例代码,请同学们复制到本地执行。

代码语言:javascript复制
// 中介者接口
interface Mediator {
    void sendMessage(String message, Colleague colleague);
}

// 具体中介者
class ConcreteMediator implements Mediator {
    private Colleague colleague1;
    private Colleague colleague2;

    public void setColleague1(Colleague colleague1) {
        this.colleague1 = colleague1;
    }

    public void setColleague2(Colleague colleague2) {
        this.colleague2 = colleague2;
    }

    @Override
    public void sendMessage(String message, Colleague colleague) {
        if (colleague == colleague1) {
            colleague2.receiveMessage(message);
        } else if (colleague == colleague2) {
            colleague1.receiveMessage(message);
        }
    }
}

// 抽象同事类
abstract class Colleague {
    protected Mediator mediator;

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

    public abstract void sendMessage(String message);

    public abstract void receiveMessage(String message);
}

// 具体同事类1
class ConcreteColleague1 extends Colleague {
    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void sendMessage(String message) {
        mediator.sendMessage(message, this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println("ConcreteColleague1 received: "   message);
    }
}

// 具体同事类2
class ConcreteColleague2 extends Colleague {
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void sendMessage(String message) {
        mediator.sendMessage(message, this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println("ConcreteColleague2 received: "   message);
    }
}

// 示例代码
public class MediatorPatternExample {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();

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

        mediator.setColleague1(colleague1);
        mediator.setColleague2(colleague2);

        colleague1.sendMessage("Hello from Colleague1!");
        colleague2.sendMessage("Hi from Colleague2!");
    }
}

在这个示例中,Mediator 是中介者接口,ConcreteMediator 是具体中介者实现类。Colleague 是抽象同事类,ConcreteColleague1ConcreteColleague2 是具体同事类。MediatorPatternExample 是示例代码的入口。

通过运行示例代码,ConcreteColleague1ConcreteColleague2 可以通过中介者对象 ConcreteMediator 进行通信。当一个同事对象发送消息时,中介者对象将消息传递给另一个同事对象,实现了对象之间的解耦。


三、中介者模式的应用场景

中介者模式适用于以下

4

种场景,请同学们认真学习。

  1. 多个对象之间存在复杂的交互关系:当多个对象之间存在复杂的相互依赖和交互行为时,可以使用中介者模式来将这些交互行为集中管理。
  2. 对象之间的耦合性高:当对象之间的耦合性较高,导致修改一个对象可能会影响到其他对象时,可以引入中介者模式来降低对象间的直接关联,并提高系统的灵活性和可维护性。
  3. 需要集中管理相关对象之间的通信:当需要集中管理对象间的通信,并且避免对象间的直接通信时,可以使用中介者模式来统一管理和协调对象间的通信行为。
  4. 系统中对象的通信行为频繁变化:当系统中对象的通信行为频繁变化时,可以使用中介者模式来简化系统的结构,并且使系统更易于扩展和维护。

常见的应用场景包括以下几种,请同学们认真学习。

  • GUI 程序的窗口管理器:窗口之间可能需要进行相互通信和协调,中介者模式可以将窗口之间的交互行为集中管理。
  • 聊天室系统:聊天室中的用户之间需要进行消息的传递和交流,中介者模式可以作为聊天室的中心对象,负责将消息传递给其他用户。
  • 交通调度系统:交通调度系统中的车辆和交通信号灯之间需要进行协调和通信,中介者模式可以作为调度中心,统一管理车辆和信号灯的交互行为。

中介者模式适用于多个对象之间存在复杂交互关系、耦合性高、需要集中管理对象间通信行为、系统中对象的通信行为频繁变化等场景。它能够简化系统结构,降低对象间的耦合性,并提高系统的灵活性和可维护性。


四、中介者模式面试题

一、什么是中介者模式?它的作用是什么?

中介者模式是一种行为型设计模式,通过引入一个中介者对象来解耦一组对象之间的关系。它的作用是将对象之间的通信行为集中在一个中介者对象中,降低对象之间的耦合性,使系统更加灵活和可扩展。

二、 中介者模式的角色有哪些?

  • 中介者(Mediator):定义了各个具体同事对象之间的协调行为接口。
  • 具体中介者(ConcreteMediator):实现了中介者接口,负责协调和管理一组相关对象之间的交互关系。
  • 同事(Colleague):定义了对象之间通信的接口。
  • 具体同事(ConcreteColleague):实现了同事接口,负责与其他同事对象进行通信。

三、在Java中如何实现中介者模式?

  • 在 Java 中,可以通过定义中介者接口和具体中介者类,以及同事接口和具体同事类来实现中介者模式。具体同事类通过持有中介者对象,通过中介者来进行通信和协调。

四、中介者模式的优点有哪些?

  • 降低了对象之间的直接依赖,减少了耦合性。
  • 将对象之间的通信行为集中在一个中介者对象中,使系统易于维护和扩展。

五、中介者模式的缺点有哪些?

  • 中介者对象可能会变得过于复杂,增加了系统的复杂性。

六、中介者模式和观察者模式有什么区别?

  • 中介者模式着重于对象之间的交互行为的协调和管理,通过引入中介者对象来解耦对象之间的关系。
  • 观察者模式着重于对象之间的状态变化的通知和订阅,通过定义观察者和被观察者来实现对象之间的解耦。

0 人点赞