23种设计模式之中介者模式

目录

  • [1. 简介](#1. 简介)
  • [2. 代码](#2. 代码)
    • [2.1 Mediator (中介者接口)](#2.1 Mediator (中介者接口))
    • [2.2 ChatRoom (具体中介者类)](#2.2 ChatRoom (具体中介者类))
    • [2.3 User (同事接口)](#2.3 User (同事接口))
    • [2.4 ChatUser (具体同事类)](#2.4 ChatUser (具体同事类))
    • [2.5 Test (测试)](#2.5 Test (测试))
    • [2.6 运行结果](#2.6 运行结果)
  • [3. 使用场景](#3. 使用场景)
  • [4. 优缺点](#4. 优缺点)
  • [5. 总结](#5. 总结)

1. 简介

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

例如,在一个聊天软件系统中,多个用户(同事、朋友等)之间的聊天消息传递可以通过一个服务器(中介者)来进行。用户不需要直接知道其他用户的联系方式或者网络地址等信息,只需要将消息发送给服务器,服务器再将消息转发给指定的其他用户。

结构:

  • 中介者(Mediator)接口
    这是所有具体中介者类都要实现的接口,它定义了用于协调各同事对象(Colleague)之间交互的方法。
  • 具体中介者(Concrete Mediator)类
    具体中介者类实现了中介者接口,它包含了对多个同事对象的引用,并通过这些引用协调同事对象之间的交互。在聊天软件中,服务器类就是具体中介者类,它维护了在线用户列表,并负责将消息从一个用户转发给另一个用户。
  • 同事(Colleague)接口
    同事接口定义了同事对象与中介者进行交互的方法。在聊天软件中,这个接口可以包含发送消息和接收消息的方法。
  • 具体同事(Concrete Colleague)类
    具体同事类实现了同事接口,它持有一个中介者对象的引用,通过这个引用与其他同事进行间接的交互。在聊天软件中,用户客户端类就是具体同事类,它在发送消息时将消息发送给服务器(中介者),接收消息时也是从服务器获取消息。

2. 代码

2.1 Mediator (中介者接口)

java 复制代码
public interface Mediator {
    void work(User user, String message);
}

2.2 ChatRoom (具体中介者类)

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class ChatRoom implements Mediator{
    private List<User> users = new ArrayList<>();

    @Override
    public void work(User user, String message) {
        for (User otherUser : users) {
            if (otherUser!= user) {
                otherUser.receiveMessage(message);
            }
        }
    }

    public void addUser(User user) {
        users.add(user);
    }
}

2.3 User (同事接口)

java 复制代码
public interface User {
    void sendMessage(String message);
    void receiveMessage(String message);
}

2.4 ChatUser (具体同事类)

java 复制代码
public class ChatUser implements User{
    private Mediator mediator;
    private String name;

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

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

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

2.5 Test (测试)

java 复制代码
public class Test {
    public static void main(String[] args) {
        ChatRoom mediator = new ChatRoom();
        User robert = new ChatUser(mediator,"Robert");
        User john = new ChatUser(mediator,"John");

        mediator.addUser(robert);
        mediator.addUser(john);
        robert.sendMessage("Hi John!");
        john.sendMessage("Hello Robert!");
    }
}

2.6 运行结果

John received message: Hi John!
Robert received message: Hello Robert!

3. 使用场景

  1. 复杂交互关系:当系统中存在多个对象之间复杂的依赖关系时,中介者模式可以简化这些关系,使系统更加清晰易维护。例如,在一个聊天室应用中,用户通过中介者(如聊天室)进行消息传递,而不是直接与其他用户建立连接,这样可以降低直接依赖,增加系统的灵活性。
  2. 减少子类生成:在需要处理大量子类的情况下,中介者模式可以集中处理对象间的交互逻辑,避免直接耦合,从而减少子类的数量。
  3. 强耦合问题:中介者模式能够降低对象间的强耦合,提高系统的灵活性。例如,在一个电子商务平台中,买家、卖家和订单管理系统之间可以通过中介者进行协调,从而简化复杂的交互逻辑。
  4. 多对象共享中介者:当多个对象需要共享同一个中介者时,中介者负责协调这些对象之间的通信。例如,在分布式系统中,中介者可以充当调度中心,协调不同节点的工作。
  5. GUI系统:在图形用户界面(GUI)系统中,中介者模式可以用来管理各个控件之间的交互。例如,当用户点击某个按钮时,中介者对象负责将这个事件通知给相关的控件,从而触发相应的操作。
  6. 事件处理系统:在事件处理系统中,中介者对象可以负责协调事件的发布和订阅,确保事件能及时传递给感兴趣的对象。
  7. 多线程系统:在多线程系统中,中介者模式可以用来协调不同线程之间的交互。例如,当某个线程需要与另一个线程通信时,它只需要通过中介者对象来发送消息,而不需要直接与另一个线程建立连接。
  8. 分布式系统:在分布式系统中,中介者模式可以用来协调不同组件之间的通信。例如,某个组件需要与另一个组件通信时,它只需要通过中介者对象来发送消息,而不需要直接与另一个组件建立连接。
  9. MVC架构:在MVC架构中,控制器(Controller)充当模型(Model)和视图(View)之间的中介者,从而降低对象之间的耦合性。

中介者模式的优点包括降低耦合度、提高系统的可维护性和可扩展性。然而,过度使用可能导致中介者对象过于复杂,难以维护和管理。因此,在实际应用中需要谨慎选择其使用时机,并合理划分中介者的职责。

4. 优缺点

  • 优点:

    1. 降低耦合度:中介者模式通过将多个对象的交互封装在中介者中,使得各个对象不再直接相互引用,从而减少了对象间的依赖关系。这种解耦合的设计使得对象可以独立变化和复用,提高了代码的可维护性和灵活性。
    2. 集中控制:所有的交互逻辑都由中介者集中管理,这使得系统的行为更加清晰,代码维护更为集中。因此,当需要修改系统行为时,只需修改中介者即可,而无需修改其他对象。
    3. 提高可扩展性:中介者模式允许在不改变现有对象的情况下添加新的对象或行为,只需修改中介者即可实现扩展。这使得系统更容易添加或删除对象,而无需影响其他对象。
    4. 简化对象交互:中介者模式将复杂的交互逻辑集中在中介者中,使得对象之间的交互变得简单和集中。这有助于简化系统结构,降低系统的复杂度。
    5. 增强对象的封装性:同事对象只需与中介者通信,不必知道其他同事的存在,从而增强了对象的封装性。
  • 缺点:

    1. 中介者复杂性:随着系统中对象数量的增加,中介者需要处理的逻辑变得复杂,可能导致中介者自身变得难以维护。具体中介者类可能会变得庞大且复杂,难以管理和维护。
    2. 性能开销:中介者模式引入了一个额外的中介者对象,这可能会增加系统的性能开销。在通信期间需要额外的调度,可能会影响性能。
    3. 单点故障:中介者模式引入了一个中心化的中介者对象,如果这个中介者出现问题,可能会影响整个系统的功能。这增加了系统的脆弱性。
    4. 过度依赖中介者:如果设计不当,中介者可能成为系统中的"上帝对象",承担过多的职责,导致系统难以维护。
    5. 不适用简单场景:在对象之间的交互相对简单的情况下,使用中介者模式可能会引入不必要的复杂性,增加代码的复杂度。
    6. 违背开闭原则:当新的同事对象被加入时,可能需要修改中介者对象的代码,这违反了开闭原则。

中介者模式在处理复杂的对象交互场景中具有显著的优势,但在简单场景下可能会显得过于繁琐。因此,在使用中介者模式时,需要根据具体情况权衡其优缺点,确保模式的使用能够带来实际的设计和维护好处。

5. 总结

在实际应用中,中介者模式可以用于管理复杂的系统结构,如聊天室、游戏开发中的角色和事件管理等。例如,在一个聊天系统中,每个用户通过中介者对象发送和接收消息,而不是直接与其他用户通信,从而简化了系统的交互逻辑。

中介者模式通过引入一个中介者对象来封装对象间的交互逻辑,使得系统结构更加松散耦合和易于维护。然而,在使用该模式时需要谨慎处理中介者的职责分配,以确保系统的稳定性和可维护性。

相关推荐
岳轩子2 小时前
23种设计模式之备忘录模式
windows·设计模式·备忘录模式
Vincent(朱志强)5 小时前
设计模式详解(十):策略模式——Strategy
设计模式·策略模式
WangMing_X6 小时前
C# 23种设计模式(1)单例模式(单件模式)
单例模式·设计模式
wkj0016 小时前
PHP开发设计模式:单例模式
单例模式·设计模式·php
不爱吃米饭_7 小时前
工作中常用的8种设计模式
设计模式
岳轩子7 小时前
23种设计模式之命令模式
设计模式·命令模式
岳轩子7 小时前
23种设计模式之责任链模式
java·设计模式·责任链模式
hope_wisdom8 小时前
实战设计模式之单例模式
单例模式·设计模式·架构·系统架构·软件工程
huaqianzkh9 小时前
迭代器模式的理解和实践
java·设计模式·迭代器模式