中介者模式(Mediator Pattern)

简介: 中介者模式(Mediator Pattern)是一种行为型设计模式,它用于降低多个对象之间的耦合度,通过引入一个中介者对象,将对象之间的交互转化为中介者和对象之间的交互,从而避免了对象之间的直接耦合。

中介者模式(Mediator Pattern)是一种行为型设计模式,它用于降低多个对象之间的耦合度,通过引入一个中介者对象,将对象之间的交互转化为中介者和对象之间的交互,从而避免了对象之间的直接耦合。

在中介者模式中,有三个核心角色:Mediator(中介者)、Colleague(同事类)和ConcreteMediator(具体中介者)。Mediator(中介者)是抽象中介者,Colleague(同事类)是抽象同事类,ConcreteMediator(具体中介者)是具体中介者。

下面是一个简单的中介者模式Demo,假设有一个聊天室系统,它包含了多个用户,每个用户可以发送和接收消息:

# 中介者类
class ChatRoom:
    def __init__(self):
        self._users = []

    def add_user(self, user):
        self._users.append(user)

    def send_message(self, message, sender):
        for user in self._users:
            if user != sender:
                user.receive(message)

# 同事类
class User:
    def __init__(self, name):
        self._name = name

    def send(self, message):
        chat_room.send_message(message, self)

    def receive(self, message):
        print(f"{self._name} received message: {message}")

# 客户端代码
chat_room = ChatRoom()

alice = User("Alice")
bob = User("Bob")
charlie = User("Charlie")

chat_room.add_user(alice)
chat_room.add_user(bob)
chat_room.add_user(charlie)

alice.send("Hello, Bob and Charlie!")
bob.send("Hi, Alice!")
charlie.send("Nice to meet you, Alice and Bob!")

在这个Demo中,ChatRoom是中介者类,它维护了一个用户列表,并实现了发送消息的方法。User是同事类,它包含了发送和接收消息的方法。

当客户端使用中介者模式时,需要先定义一个中介者类和多个同事类。同事类可以向中介者发送消息,中介者收到消息后,可以将消息转发给其他同事类。

中介者模式的应用场景比较广泛,例如:

  1. GUI应用程序:GUI应用程序中,多个组件之间经常需要交互,可以使用中介者模式来降低组件之间的耦合度。
  2. 聊天室系统:聊天室系统中,多个用户之间需要发送和接收消息,可以使用中介者模式来协调用户之间的交互。
  3. 航空管制系统:航空管制系统中,多个飞机之间需要协调交通,可以使用中介者模式来降低飞机之间的耦合度。

补充一下,这个示例是Python代码,下面是一个相似的Java代码示例:

import java.util.*;

// 中介者类
class ChatRoom {
   
    private final List<User> users = new ArrayList<>();

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

    public void sendMessage(String message, User sender) {
   
        for (User user : users) {
   
            if (user != sender) {
   
                user.receive(message);
            }
        }
    }
}

// 同事类
class User {
   
    private final String name;

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

    public void send(String message) {
   
        chatRoom.sendMessage(message, this);
    }

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

// 客户端代码
ChatRoom chatRoom = new ChatRoom();

User alice = new User("Alice");
User bob = new User("Bob");
User charlie = new User("Charlie");

chatRoom.addUser(alice);
chatRoom.addUser(bob);
chatRoom.addUser(charlie);

alice.send("Hello, Bob and Charlie!");
bob.send("Hi, Alice!");
charlie.send("Nice to meet you, Alice and Bob!");

以下是一些学习中介者模式的推荐资源:

《Head First 设计模式》:这是一本通俗易懂的设计模式入门书籍,其中包含了对中介者模式的讲解和示例代码。
《设计模式:可复用面向对象软件的基础》:这是设计模式的经典著作之一,其中包含了对中介者模式的详细讲解和示例代码。
《图解设计模式:以UML为基础,学习23种设计模式》:这是一本以图解为主的设计模式入门书籍,其中包含了对中介者模式的详细讲解和示例代码。
中介者模式的Java实现:这是一个包含了中介者模式示例代码的Java项目,可以帮助读者更好地理解和应用中介者模式。
GitHub链接:https://github.com/iluwatar/java-design-patterns/tree/master/mediator
总之,学习中介者模式需要结合书籍和实践,建议读者选择一些适合自己的入门书籍,同时结合实际项目中的设计问题进行实践,加深对中介者模式的理解和应用。

目录
相关文章
|
算法 安全 网络安全
CFCA国产SSL证书
随着国潮风的兴起和中国自主技术的发展,很多组织单位对网络信息安全产品的需求逐渐倾向国产化。在SSL证书需求方面也有很多的组织单位更倾向于国产SSL证书。今天,我们就先来侧重介绍一下国产SSL证书CFCA的相关特点。
472 0
|
11月前
|
数据采集 监控 数据可视化
BI工具在数据分析和业务洞察中的应用
BI工具在数据分析和业务洞察中的应用
292 11
|
11月前
|
资源调度 前端开发 JavaScript
React 测试库 React Testing Library
【10月更文挑战第22天】本文介绍了 React Testing Library 的基本概念和使用方法,包括安装、基本用法、常见问题及解决方法。通过代码案例详细解释了如何测试 React 组件,帮助开发者提高应用质量和稳定性。
343 1
|
测试技术 C# 开发工具
C# 标准性能测试
本文介绍如何使用 BenchmarkDotNet 工具进行性能测试。通过 GitHub 代码示例展示如何安装并应用此工具,对函数或静态方法进行精确的性能分析。首先需通过 NuGet 安装 BenchmarkDotNet,然后在测试函数上添加 `[Benchmark]` 特性,并使用 `BenchmarkRunner.Run&lt;&gt;();` 进行测试。测试过程中包括 Pilot、Warmup 和 Target 等阶段,并提供 Mean、Error 和 StdDev 等统计信息。
204 3
C# 标准性能测试
|
存储 并行计算 测试技术
NumPy 性能优化:提升 Python 数值计算的速度
【8月更文第30天】Python 是一种广泛使用的编程语言,在科学计算领域尤其受欢迎。然而,由于 Python 的动态类型和解释执行机制,其在处理大规模数值数据时可能会显得相对较慢。为了克服这一限制,NumPy(Numerical Python)库提供了高性能的多维数组对象以及一系列用于操作这些数组的函数。本文将探讨如何利用 NumPy 来提高 Python 中数值运算的效率。
1141 1
|
分布式计算 并行计算 数据处理
大规模数据处理的最佳实践:使用 Dask 进行高效并行计算
【8月更文第29天】在大数据时代,高效地处理大规模数据集是至关重要的。Python 社区提供了一些强大的工具来帮助开发者进行并行和分布式计算,其中之一就是 Dask。本文将详细介绍如何使用 Dask 来优化大规模数据集的处理效率,并提供一些实用的代码示例。
1895 3
|
数据采集 自然语言处理 语音技术
LangChain进阶:创建多模态应用
【8月更文第4天】随着自然语言处理 (NLP) 和计算机视觉 (CV) 技术的不断发展,多模态应用变得越来越普遍。这些应用结合了文本、图像、音频等多种数据类型,以增强用户体验并解决复杂的问题。LangChain 作为一款强大的工具链,可以很好地支持多模态数据的处理,从而开发出具有高度互动性和实用性的应用。
972 1
|
SQL 安全 关系型数据库
MySQL数据库中的增删查改(MySQL最核心,工作中最常用的部分)
MySQL数据库中的增删查改(MySQL最核心,工作中最常用的部分)
1278 0
|
存储 数据库连接 数据库
如何使用Python上传文件到FTP服务器
如何使用Python上传文件到FTP服务器
308 1
|
人工智能 Oracle 关系型数据库
一篇文章弄懂Oracle和PostgreSQL的Database Link
一篇文章弄懂Oracle和PostgreSQL的Database Link