设计模式 - 中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,它用于减少多个对象和类之间的通信复杂度。中介者模式通过提供一个中介者对象,来处理对象之间的交互,这样就可以使对象之间不需要直接引用彼此,从而实现松耦合。

中介者模式的动机

在许多系统中,类之间存在复杂的交互关系。这些类彼此之间的直接通信会导致系统难以维护和拓展。中介者模式通过引入一个中介者对象,来协调这些对象之间的通信,从而减少了类之间的依赖关系。

例如,在一个聊天系统中,每个用户需要能够与其他用户通信。如果每个用户都需要直接与其他用户进行通信,系统将变得难以管理。使用中介者模式,我们可以通过一个中介者来管理用户之间的通信,用户只需要与中介者交互即可。

中介者模式的结构

中介者模式主要包括以下几个部分:

  1. Mediator(抽象中介者):定义一个接口用于与各个同事(Colleague)对象进行通信。

  2. ConcreteMediator(具体中介者):实现抽象中介者接口,协调各个同事对象之间的通信。

  3. Colleague(同事类):定义与中介者进行交互的接口,并持有中介者的引用。

  4. ConcreteColleague(具体同事类):实现同事接口,与其他同事对象通过中介者进行交互。

以下是中介者模式的类图:

plaintext 复制代码
+----------------+          +-------------------+
|    Colleague   |          |    Mediator       |
+----------------+          +-------------------+
| -mediator      | <------> | +sendMessage()    |
| +notify()      |          |                   |
+----------------+          +-------------------+
       ^                            ^
       |                            |
       |                            |
+----------------+          +-------------------+
|ConcreteColleague|         |ConcreteMediator   |
+----------------+          +-------------------+
| +operation()   |          | +mediate()        |
+----------------+          +-------------------+

中介者模式的实现

下面是一个使用中介者模式的示例,展示了如何设计一个简单的聊天系统,其中用户通过中介者进行通信。

1. 定义抽象中介者接口

java 复制代码
// 抽象中介者接口
interface ChatMediator {
    void sendMessage(String message, User user);
    void addUser(User user);
}

2. 实现具体中介者

java 复制代码
// 具体中介者
class ChatRoom implements ChatMediator {
    private List<User> users;

    public ChatRoom() {
        this.users = new ArrayList<>();
    }

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

    @Override
    public void sendMessage(String message, User user) {
        for (User u : this.users) {
            // 消息不应发送给发送者
            if (u != user) {
                u.receive(message);
            }
        }
    }
}

3. 定义抽象同事类

java 复制代码
// 抽象同事类
abstract class User {
    protected ChatMediator mediator;
    protected String name;

    public User(ChatMediator mediator, String name) {
        this.mediator = mediator;
        this.name = name;
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}

4. 实现具体同事类

java 复制代码
// 具体同事类
class ConcreteUser extends User {
    public ConcreteUser(ChatMediator mediator, String name) {
        super(mediator, name);
    }

    @Override
    public void send(String message) {
        System.out.println(this.name + " 发送消息: " + message);
        mediator.sendMessage(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println(this.name + " 接收到消息: " + message);
    }
}

5. 使用中介者模式

java 复制代码
public class MediatorPatternDemo {
    public static void main(String[] args) {
        ChatMediator chatMediator = new ChatRoom();

        User user1 = new ConcreteUser(chatMediator, "Alice");
        User user2 = new ConcreteUser(chatMediator, "Bob");
        User user3 = new ConcreteUser(chatMediator, "Charlie");
        User user4 = new ConcreteUser(chatMediator, "Diana");

        chatMediator.addUser(user1);
        chatMediator.addUser(user2);
        chatMediator.addUser(user3);
        chatMediator.addUser(user4);

        user1.send("Hello, everyone!");
        user2.send("Hi, Alice!");
    }
}

输出结果

Alice 发送消息: Hello, everyone!
Bob 接收到消息: Hello, everyone!
Charlie 接收到消息: Hello, everyone!
Diana 接收到消息: Hello, everyone!
Bob 发送消息: Hi, Alice!
Alice 接收到消息: Hi, Alice!
Charlie 接收到消息: Hi, Alice!
Diana 接收到消息: Hi, Alice!

中介者模式的优缺点

优点

  1. 降低耦合性:通过中介者对象进行通信,各个同事类之间不需要直接引用彼此,减少了类之间的依赖性。

  2. 增强可扩展性:添加新的同事类或修改现有同事类时,无需修改其他同事类,只需改变中介者对象即可。

  3. 简化对象间的通信:中介者模式集中管理对象间的交互逻辑,使得系统的通信更为清晰和直观。

缺点

  1. 可能导致中介者过于复杂:如果系统中对象之间的交互逻辑非常复杂,中介者对象本身可能会变得过于复杂和庞大。

  2. 隐藏了类之间的真实关系:由于对象之间的直接通信被中介者替代,类之间的交互变得不那么直观。

适用场景

中介者模式适用于以下场景:

  • 多个对象之间有复杂的交互关系,并且这种交互关系是可以独立于这些对象的逻辑来实现的。

  • 需要动态调整对象之间的交互,可以通过中介者对象来集中管理交互逻辑。

  • 希望通过解耦来简化类之间的交互,提高系统的可维护性和可扩展性。

总结

中介者模式是一种强大的设计模式,可以帮助我们简化对象之间的复杂交互逻辑。在实现中,需要注意中介者对象的复杂度,确保其不会成为系统的性能瓶颈。通过合理设计中介者模式,可以显著提高系统的灵活性和可维护性。

相关推荐
笑笑布丁23 分钟前
一些python实践
linux·python
战族狼魂25 分钟前
java代码 识别pdf文件是否含有表格
java·python·pdf
程序者王大川28 分钟前
【大数据】如何读取多个Excel文件并计算列数据的最大求和值
开发语言·python·excel·big data
lizi888881 小时前
打包Python代码的常用方法实现程序exe应用
开发语言·python
yava_free1 小时前
机器学习TFIDF的情感分类文章
python·机器学习·分类·tf-idf
api茶飘香2 小时前
守护应用边界:通过反射API实现安全的输入输出过滤
java·开发语言·python·安全·django·virtualenv·pygame
安全在心中3 小时前
python-网页自动化(三)
运维·python·自动化
Slow3 小时前
自动化焊缝定义程序fe-safe
运维·python·自动化
ok!ko5 小时前
设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)
java·开发语言·设计模式
学地理的小胖砸6 小时前
【GEE的Python API】
大数据·开发语言·前端·python·遥感·地图学·地理信息科学