2023-7-14-第十九式中介者模式

简介: 2023-7-14-第十九式中介者模式

😉一、基础概念

中介者模式(Mediator Pattern)是一种行为型设计模式,用于解耦多个对象之间的复杂交互和通信。在中介者模式中,多个对象不直接相互通信,而是通过一个中介者对象进行通信。

中介者模式的核心思想是将对象之间的交互逻辑封装到中介者对象中,从而使得各个对象之间的关系变得松散。这样一来,每个对象只需要与中介者进行交互,而无需了解其他对象的存在和细节,从而简化了对象之间的耦合关系。

在中介者模式中,通常会有一个抽象中介者类或接口,定义了对象之间交互的方法。具体的中介者类实现了这些方法,并负责协调对象之间的交互。同时,每个参与者(Colleague)都持有对中介者对象的引用,用于与中介者进行通信。

中介者模式的优点包括:

  1. 减少了对象之间的直接依赖,降低了耦合性,使得对象之间的交互更加灵活和可扩展。
  2. 将复杂的交互逻辑集中在中介者中,使得系统更易于理解和维护。
  3. 可以简化对象之间的通信流程,提高系统的可维护性和可扩展性。

然而,中介者模式也有一些注意事项:

  1. 过度使用中介者模式可能会导致中介者本身变得复杂和庞大,降低了代码的可读性和可维护性。因此,在应用中介者模式时需要谨慎权衡对象之间的交互复杂性和中介者的复杂性。
  2. 中介者模式可能会引入单点故障问题,即若中介者出现问题,则整个系统的交互可能会受到影响。因此,在设计中介者模式时需要考虑系统的稳定性和可靠性。

总结起来,中介者模式提供了一种通过中介者对象来管理多个对象之间交互的方式,解耦了对象之间的关系,同时简化了系统的设计和维护。它适用于对象之间的交互较为复杂、耦合度较高的场景,可以提高系统的灵活性和可扩展性。


🐱‍🐉二、中介者模式实现

在C++中实现中介者模式,可以按照以下步骤进行:

  1. 定义抽象中介者类(Mediator):该类定义了对象之间交互的接口方法。可以使用纯虚函数或者具有默认实现的虚函数来定义这些接口方法。
class Mediator {
public:
    virtual void sendMessage(const std::string& message, class Colleague* colleague) = 0;
};
  1. 定义具体中介者类(ConcreteMediator):实现抽象中介者类,并负责协调对象之间的交互。它通常会维护一个对象列表,用于管理参与者对象。
class ConcreteMediator : public Mediator {
private:
    std::vector<Colleague*> colleagues;
public:
    void addColleague(Colleague* colleague) {
        colleagues.push_back(colleague);
    }
    void sendMessage(const std::string& message, Colleague* colleague) override {
        for (auto c : colleagues) {
            if (c != colleague) {
                c->receiveMessage(message);
            }
        }
    }
};
  1. 定义抽象参与者类(Colleague):该类定义了参与者对象的基本行为和属性,包括发送消息和接收消息的方法。
class Colleague {
protected:
    Mediator* mediator;
public:
    Colleague(Mediator* mediator) : mediator(mediator) {}
    virtual void sendMessage(const std::string& message) = 0;
    virtual void receiveMessage(const std::string& message) = 0;
};
  1. 定义具体参与者类(ConcreteColleague):实现抽象参与者类,并根据需要重写发送消息和接收消息的方法。
class ConcreteColleague : public Colleague {
public:
    ConcreteColleague(Mediator* mediator) : Colleague(mediator) {}
    void sendMessage(const std::string& message) override {
        mediator->sendMessage(message, this);
    }
    void receiveMessage(const std::string& message) override {
        std::cout << "Received Message: " << message << std::endl;
    }
};
  1. 在客户端代码中使用中介者模式:
int main() {
    ConcreteMediator mediator;
    ConcreteColleague colleague1(&mediator);
    ConcreteColleague colleague2(&mediator);
    mediator.addColleague(&colleague1);
    mediator.addColleague(&colleague2);
    colleague1.sendMessage("Hello, colleague2!");
    colleague2.sendMessage("Hi, colleague1!");
    return 0;
}

在上述示例中,我们创建了一个具体的中介者对象(ConcreteMediator),以及两个具体的参与者对象(ConcreteColleague)。中介者对象负责协调参与者对象之间的交互。每个参与者对象通过中介者对象来发送消息,并接收其他参与者对象的消息。

注意,在实际应用中,可能会有更复杂的参与者对象和中介者对象的交互逻辑,可以根据具体需求进行扩展和修改。同时,还可以考虑使用设计模式中的单例模式来保证中介者对象的唯一性。


🎉三、模块之间的关系

在中介者模式中,涉及以下几个模块之间的关系:

  1. 中介者(Mediator):中介者是一个抽象类或接口,定义了对象之间交互的方法。具体的中介者类实现了这些方法,并负责协调对象之间的交互。
  2. 参与者(Colleague):参与者是指需要相互通信和交互的对象。每个参与者都持有对中介者对象的引用,用于与中介者进行通信。
  3. 具体中介者(ConcreteMediator):具体中介者类实现了中介者的接口,并负责协调参与者对象之间的交互。它维护了一个参与者对象的列表,并在接收到消息时通知其他参与者。
  4. 具体参与者(ConcreteColleague):具体参与者类实现了参与者的接口,并根据具体需求重写发送消息和接收消息的方法。它们通过中介者对象来发送消息,并接收其他参与者对象的消息。

整体关系如下图所示:

┌─────────────────┐
│    Mediator     │
├─────────────────┤
│+ sendMessage()  │
└─────────────────┘
┌─────────────────┐
│    Colleague    │
├─────────────────┤
│- mediator       │
│+ sendMessage()  │
│+ receiveMessage()│
└─────────────────┘
┌───────────────────────┐
│  ConcreteMediator     │
├───────────────────────┤
│- colleagues           │
│+ addColleague()       │
│+ sendMessage()        │
└───────────────────────┘
┌─────────────────┐
│ConcreteColleague│
├─────────────────┤
│+ sendMessage()  │
│+ receiveMessage()│
└─────────────────┘

在中介者模式中,参与者之间的交互通过中介者进行,参与者对象只需要与中介者对象进行通信,而无需了解其他参与者的存在和细节。这样一来,对象之间的耦合关系降低,系统的灵活性和可扩展性也提高了。中介者模式将复杂的交互逻辑集中在中介者中,简化了对象之间的通信和协作过程。


🐱‍🚀四、注意事项

在使用中介者模式时,有几个注意事项需要考虑:

  1. 中介者类的职责:中介者类负责协调对象之间的交互,但是需要注意避免将过多的责任和逻辑集中到中介者类中。如果中介者类变得过于庞大或复杂,可能会影响代码的可读性和维护性。因此,应该合理划分和分配参与者之间的交互逻辑,确保中介者类不至于过于臃肿。
  2. 参与者与中介者的耦合关系:虽然中介者模式可以降低参与者之间的直接依赖关系,但是参与者对象仍然需要持有对中介者对象的引用。这种引用关系会带来一定的耦合。因此,需要权衡每个参与者对象是否真正需要与中介者进行通信,并根据实际需求进行设计。
  3. 单一职责原则:参与者对象应该专注于自己的职责和行为,而不应与其他参与者对象之间直接通信。中介者模式提供了一种协调机制,以确保参与者对象之间的交互通过中介者进行。因此,在设计参与者对象时,遵循单一职责原则,将其职责和行为限制在合理的范围内。
  4. 中介者对象的唯一性:在实际应用中,可能需要确保只有一个中介者对象存在。这可以通过使用单例模式来实现,以保证系统中的中介者对象是唯一的。
  5. 系统稳定性和可靠性:中介者模式引入了一个中心化的协调机制,使得参与者对象之间的交互依赖于中介者对象。因此,在设计和实现中介者模式时,需要考虑系统的稳定性和可靠性。如果中介者对象出现问题或故障,可能会影响整个系统的功能和性能。

综上所述,中介者模式可以提供一种解耦和协调对象之间交互的方式,但也需要注意合理划分职责、避免过度集中逻辑、权衡参与者与中介者的耦合关系,并确保系统的稳定性和可靠性。


🎂五、使用场景

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

  1. 对象之间的交互复杂:当多个对象之间的交互变得复杂且难以维护时,可以使用中介者模式将交互逻辑集中管理。中介者模式能够简化对象之间的通信流程,提高系统的可维护性和可扩展性。
  2. 对象之间的耦合度高:当对象之间的耦合度较高且需要解耦时,中介者模式可以起到解耦的作用。通过引入一个中介者对象,参与者对象只需要与中介者进行通信,而无需直接依赖其他参与者对象。
  3. 系统中的消息传递和调度:当系统中存在大量的消息传递和调度时,中介者模式可以提供一种集中管理消息传递和调度的方式。中介者作为调度器,负责协调和分发消息,简化了系统中的消息处理逻辑。
  4. 事件驱动系统:当系统需要响应多个不同对象的事件,并且这些事件之间有关联或依赖关系时,中介者模式可以帮助管理和协调这些事件的处理。中介者充当了事件的中心调度者,使得各个对象之间的事件处理更加灵活和可扩展。
  5. GUI应用程序:图形用户界面(GUI)应用程序中,通常存在多个控件和组件之间的交互。使用中介者模式可以简化控件之间的通信和协作,提高用户界面的可维护性和可扩展性。

需要注意的是,中介者模式可能会引入一个单点故障问题,即如果中介者对象出现问题或故障,整个系统的交互可能会受到影响。因此,在应用中介者模式时需要权衡系统的稳定性和可靠性。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于中介者模式的知识。


目录
相关文章
|
消息中间件
操作系统(2.4.5)--管程机制
局部于管程内部的数据结构,仅能被局部于管程内部的过程所访问,任何管程外的过程都不能访问它;反之,局部于管程内部的过程也仅能访问管程内的数据结构。 由此可见,管程相当于围墙,它把共享变量和对它进行操作的若干过程围了起来,所有时,都必须经过管程(相当于通过围墙的进程要访问临界资源门)才能进入,而管程每次只准许一个进程进入管程,从而实现了进程互斥。
548 0
|
Web App开发 编解码 vr&ar
使用Web浏览器访问UE应用的最佳实践
在3D/XR应用开发中,尤其是基于UE(虚幻引擎)开发的高精度场景,传统终端因硬件局限难以流畅运行高帧率、复杂效果的三维应用。实时云渲染技术,将渲染任务转移至云端服务器,降低终端硬件要求,确保用户获得流畅体验。具备弹性扩展、优化传输协议、跨平台支持和安全性等优势,适用于多种终端和场景,特别集成像素流送技术,帮助UE开发者实现低代码上云操作,简化部署流程,保留UE引擎的强大开发能力,确保画面精美且终端轻量化。
726 17
使用Web浏览器访问UE应用的最佳实践
|
人工智能 运维 监控
智能运维在现代数据中心的应用与挑战
随着云计算和大数据技术的迅猛发展,现代数据中心的运维管理面临着前所未有的挑战。本文探讨了智能运维技术在数据中心中的应用,包括自动化监控、故障预测与诊断、资源优化等方面,并分析了当前面临的主要挑战,如数据安全、系统集成复杂性等。通过实际案例分析,展示了智能运维如何帮助数据中心提高效率、降低成本,并提出了未来发展趋势和建议。
|
机器学习/深度学习 存储 自然语言处理
深度学习之少样本学习
少样本学习(Few-Shot Learning, FSL)是深度学习中的一个重要研究领域,其目标是在只有少量标注样本的情况下,训练出能够很好地泛化到新类别或新任务的模型。
804 2
|
机器学习/深度学习 人工智能 搜索推荐
🔥解锁AI魔法!生成式大模型入门,你的“提示词”就是金钥匙🗝️
【8月更文挑战第1天】在科技浪潮中,生成式大模型作为AI领域的明星,正引领创作革命。这些模型如GPT和DALL-E,通过深度学习技术,在海量数据中学习理解与创造内容。要驾驭这些模型,关键在于设计精妙的提示词。提示词不仅是简单的指令,更是激发AI创造力的灵魂。例如,创作关于“未来教育”的文章时,“2050年个性化学习如何颠覆传统教学?”比“未来教育”能引导生成更深入、生动的内容。在图像生成方面,详细描绘场景加上情感色彩的提示词,如“星空下的古老城堡”,能使生成的图像更加引人入胜。通过不断优化提示词,我们可以开启AI无限创意的大门,见证科技与艺术的完美融合。
662 7
|
关系型数据库 数据库 PostgreSQL
Linux 环境手动备份postgresql数据库
【8月更文挑战第12天】在Docker环境中使用命令行工具对PostgreSQL数据库进行备份和恢复。首先,通过dockerexec进入容器,使用pg_dump进行数据库模式的备份,然后使用dockercp将备份文件导出。接着,若需导入数据到另一数据库,先将备份文件复制到目标容器,再利用psql命令进行数据恢复。整个过程需确保目标数据库无同名模式,以防止导入失败
568 3
|
IDE API 数据处理
 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Slider组件
 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Slider组件
684 7
|
机器学习/深度学习
R语言多元Logistic逻辑回归 应用案例
R语言多元Logistic逻辑回归 应用案例
|
存储 缓存 文件存储
408操作系统学习笔记——文件管理(三)
408操作系统学习笔记——文件管理
1247 1
408操作系统学习笔记——文件管理(三)
|
机器学习/深度学习 人工智能 安全
超长序列,超快预测!深势科技联手阿里云,AI蛋白质预测再下一城
强强联合,突破 AI 蛋白质预测模型推理性能瓶颈,支持最高 6.6k 长氨基酸序列蛋白质的预测计算,达到目前已知最优推理效果。
超长序列,超快预测!深势科技联手阿里云,AI蛋白质预测再下一城

热门文章

最新文章