首页 > Python资料 博客日记
Qt C++设计模式->中介者模式
2024-10-14 03:00:10Python资料围观32次
中介者模式(Mediator Pattern)是一种行为型设计模式,定义了一个对象用于封装一系列对象之间的交互。中介者使得对象之间不再需要显式地相互引用,减少了对象之间的依赖关系,从而使系统更加松散耦合,并且可以独立地改变对象之间的交互。
中介者模式的应用场景
中介者模式适用于当多个对象之间存在复杂的通信关系时,通过引入一个中介者对象来管理这些对象之间的交互,避免了对象之间直接相互依赖,降低系统的复杂性。常见的应用场景包括:
-
GUI系统:在复杂的用户界面中,不同的控件(如按钮、文本框等)可能需要交互。中介者模式可以协调这些控件之间的通信,使得每个控件只与中介者交互。
-
聊天系统:在一个聊天室中,用户可以相互发送消息,使用中介者可以让每个用户只与中介者交互,由中介者负责消息的分发。
-
航空控制系统:飞机之间的通信可以通过中介者(如塔台)来进行协调,避免它们直接通信。
中介者模式的核心
中介者模式通过引入一个中介者对象来协调多个对象之间的通信。模式中的主要组成部分包括:
-
中介者接口(Mediator):定义了与对象交互的接口,负责通知对象并管理对象之间的交互。
-
具体中介者(Concrete Mediator):实现了中介者接口,负责具体的交互逻辑。
-
同事类(Colleague):代表参与交互的对象,它们只通过中介者来通信,不直接与其他同事对象进行交互。
中介者模式示例代码
假设我们在开发一个简化版的聊天室系统,每个用户可以向聊天室发送消息,聊天室负责将消息分发给其他用户。
1. 定义中介者接口和具体中介者
#include <QDebug>
#include <QString>
#include <QList>
// 前向声明
class User;
// 中介者接口
class ChatMediator {
public:
virtual void sendMessage(const QString& message, User* sender) = 0; // 发送消息方法
virtual void addUser(User* user) = 0; // 添加用户
virtual ~ChatMediator() = default;
};
// 同事类接口:用户
class User {
protected:
ChatMediator* mediator; // 持有中介者对象
QString name;
public:
User(ChatMediator* mediator, const QString& name) : mediator(mediator), name(name) {}
virtual void send(const QString& message) = 0; // 发送消息
virtual void receive(const QString& message) const = 0; // 接收消息
};
// 具体同事类:聊天室用户
class ChatUser : public User {
public:
ChatUser(ChatMediator* mediator, const QString& name) : User(mediator, name) {}
void send(const QString& message) override {
qDebug() << name << "sends:" << message;
mediator->sendMessage(message, this); // 通过中介者发送消息
}
void receive(const QString& message) const override {
qDebug() << name << "receives:" << message;
}
};
// 具体中介者:聊天室
class ChatRoom : public ChatMediator {
private:
QList<User*> users; // 用户列表
public:
void addUser(User* user) override {
users.append(user); // 添加用户到聊天室
}
void sendMessage(const QString& message, User* sender) override {
// 遍历所有用户,将消息发送给除了发送者以外的所有用户
for (User* user : users) {
if (user != sender) {
user->receive(message);
}
}
}
};
// 使用示例
int main() {
// 创建聊天室
ChatRoom* chatRoom = new ChatRoom();
// 创建用户
User* user1 = new ChatUser(chatRoom, "Alice");
User* user2 = new ChatUser(chatRoom, "Bob");
User* user3 = new ChatUser(chatRoom, "Charlie");
// 将用户添加到聊天室
chatRoom->addUser(user1);
chatRoom->addUser(user2);
chatRoom->addUser(user3);
// 用户发送消息
user1->send("Hello everyone!"); // 输出:Bob receives: Hello everyone!; Charlie receives: Hello everyone!
user2->send("Hi Alice!"); // 输出:Alice receives: Hi Alice!; Charlie receives: Hi Alice!
// 清理内存
delete user1;
delete user2;
delete user3;
delete chatRoom;
return 0;
}
代码解析
-
ChatMediator接口:定义了一个用于发送消息和添加用户的中介者接口。
-
ChatRoom类:这是具体的中介者,管理聊天室的用户,并负责将消息从发送者分发给其他用户。
-
User类:这是同事类的基类,表示参与聊天的用户。用户通过中介者来发送和接收消息。
-
ChatUser类:具体的同事类,表示聊天室中的具体用户。它们只与中介者
ChatRoom
进行交互,而不直接与其他用户通信。 -
客户端代码:客户端通过创建用户并将它们添加到聊天室,用户可以通过中介者发送和接收消息,而不需要直接知道其他用户的存在。
中介者模式的优点
-
降低耦合性:中介者模式消除了对象之间的直接依赖,使得同事对象只需与中介者交互,降低了系统的耦合性,提升了模块的独立性和可维护性。
-
简化对象的通信:中介者负责管理对象之间的通信,简化了多对象之间的复杂通信逻辑。
-
集中控制交互:中介者可以集中管理和控制对象之间的交互,便于修改和扩展交互逻辑。
中介者模式的缺点
-
增加复杂性:中介者可能会变得过于复杂,承担过多的责任,变成一个“上帝对象”(God Object),使得维护中介者本身变得困难。
-
中介者变得庞大:随着系统的复杂化,中介者会变得越来越大,可能导致中介者的设计难以管理。
适合使用中介者模式的情况
-
对象之间的通信过于复杂:如果多个对象之间的交互非常复杂并且紧密耦合,使用中介者模式可以简化这些交互,并解耦各对象。
-
需要集中管理对象的交互:当系统的交互逻辑较为复杂,并且可能会经常变化时,中介者模式提供了集中控制交互的方式。
Qt中的中介者模式应用
在Qt开发中,中介者模式可以用于处理控件之间的交互。例如,多个控件之间的状态可能需要互相影响,如按钮、文本框、复选框等。通过引入一个中介者,可以让这些控件只与中介者通信,而不是直接互相依赖,这样可以避免UI控件之间的耦合。
中介者模式还可以应用于事件处理系统中,Qt的信号与槽机制与中介者模式有相似之处:通过信号与槽的机制,信号的发送者和接收者彼此不需要知道对方的存在,类似于中介者在管理多个对象之间的交互。
总结
中介者模式通过引入一个中介者对象,将对象之间的直接交互转换为通过中介者来进行,从而降低了对象之间的耦合度。它适用于对象之间交互复杂且紧密耦合的场景,通过集中控制交互,提升了系统的可维护性和灵活性。
标签:
相关文章
最新发布
- 【Python】selenium安装+Microsoft Edge驱动器下载配置流程
- Python 中自动打开网页并点击[自动化脚本],Selenium
- Anaconda基础使用
- 【Python】成功解决 TypeError: ‘<‘ not supported between instances of ‘str’ and ‘int’
- manim边学边做--三维的点和线
- CPython是最常用的Python解释器之一,也是Python官方实现。它是用C语言编写的,旨在提供一个高效且易于使用的Python解释器。
- Anaconda安装配置Jupyter(2024最新版)
- Python中读取Excel最快的几种方法!
- Python某城市美食商家爬虫数据可视化分析和推荐查询系统毕业设计论文开题报告
- 如何使用 Python 批量检测和转换 JSONL 文件编码为 UTF-8
点击排行
- 版本匹配指南:Numpy版本和Python版本的对应关系
- 版本匹配指南:PyTorch版本、torchvision 版本和Python版本的对应关系
- Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO
- 相关性分析——Pearson相关系数+热力图(附data和Python完整代码)
- Python与PyTorch的版本对应
- Anaconda版本和Python版本对应关系(持续更新...)
- Python pyinstaller打包exe最完整教程
- Could not build wheels for llama-cpp-python, which is required to install pyproject.toml-based proj