公司网站哪里好/平台推广销售话术

公司网站哪里好,平台推广销售话术,btb网站设计,网站建设公司好做吗系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客 1.概述 中介者模式(Mediator Pattern)是一种行为设计模式,旨在通过一个中介对象来封装一系列对象之间的交互方式,从而减少这些对象间的直接依赖。在该模式…

 系列总链接:《大话设计模式》学习记录_net 大话设计-CSDN博客

1.概述

     中介者模式(Mediator Pattern)是一种行为设计模式,旨在通过一个中介对象来封装一系列对象之间的交互方式,从而减少这些对象间的直接依赖。在该模式下,各个组件(同事)不再直接相互通信,而是通过中介者进行间接沟通,这极大地降低了系统的耦合度。具体来说,中介者定义了同事类之间的通信接口,并负责协调同事对象之间的交互逻辑。每个同事类都知道其对应的中介者对象,但并不直接与其他同事类交互。

2.结构与实现

结构:

  • Mediator(抽象中介者):定义同事类之间的通信接口。
  • ConcreteMediator(具体中介者):实现了抽象中介者的接口,并协调各同事对象之间的交互。
  • Colleague Class(抽象同事类):每个同事类都知道其对应的中介者对象,并且可以通过中介者发送消息给其他同事。
  • ConcreteColleague(具体同事类):实现了抽象同事类,负责发送和接收消息。

实现:

假设我们要创建一个简单的聊天应用程序,用户之间通过ChatRoom(中介者)进行交流。

代码目录结构为:

首先,定义ChatRoom作为抽象中介者:

ChatRoom.h:

#ifndef CHATROOM_H
#define CHATROOM_H#include <QString>class User; // 前向声明User类,避免循环依赖// 抽象中介者:定义同事类之间的通信接口。
class ChatRoom {
public:virtual void sendMessage(const QString& message, User* user) = 0; // 发送消息的纯虚函数
};#endif // CHATROOM_H

ConcreteChatRoom.h

#ifndef CONCRETECHATROOM_H
#define CONCRETECHATROOM_H#include "ChatRoom.h"
#include <QList> // Qt容器类,用于存储用户列表
#include "User.h"// 具体中介者:实现了抽象中介者的接口,并协调各同事对象之间的交互。
class ConcreteChatRoom : public ChatRoom {
private:QList<User*> users; // 存储所有用户的列表
public:// 添加用户到聊天室中void addUser(User* user) {users.append(user);}// 实现发送消息的功能void sendMessage(const QString& message, User* user) override;
};#endif // CONCRETECHATROOM_H

ConcreteChatRoom.cpp

#include "ConcreteChatRoom.h"
#include "User.h"
#include <QDebug>// 实现sendMessage方法,遍历所有用户并转发消息给其他用户(除了发送者)
void ConcreteChatRoom::sendMessage(const QString& message, User* user)
{// 遍历所有用户for (User* u : users){if(u != user) { // 如果不是消息的发送者,则转发消息u->receiveMessage(message); // 调用接收消息的方法}}
}

User.h

#ifndef USER_H
#define USER_H#include <QString>
#include "ChatRoom.h" // 包含中介者接口// 抽象同事类:每个同事类都知道其对应的中介者对象,并且可以通过中介者发送消息给其他同事。
class User {
protected:ChatRoom* chatroom; // 指向中介者的指针QString name; // 用户名
public:// 构造函数,初始化中介者和用户名User(ChatRoom* chatroom, const QString& name): chatroom(chatroom), name(name) {}// 发送消息的方法virtual void sendMessage(const QString& message);// 接收消息的方法virtual void receiveMessage(const QString& message);// 获取用户名的方法QString getName() const { return name; }
};#endif // USER_H

User.cpp

#include "User.h"
#include "ConcreteChatRoom.h" // 包含具体中介者的头文件
#include <QDebug>// 发送消息的实现
void User::sendMessage(const QString& message) {qDebug() << getName() << " sends: " << message; // 打印发送者信息chatroom->sendMessage(message, this); // 通过中介者发送消息
}// 接收消息的实现
void User::receiveMessage(const QString& message) {qDebug() << getName() << " receives: " << message; // 打印接收者信息
}

main.cpp:

#include <QCoreApplication>
#include "ConcreteChatRoom.h" // 包含具体中介者
#include "User.h" // 包含同事类int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建一个具体的中介者实例ConcreteChatRoom chatRoom;// 创建两个用户并关联到同一个中介者User user1(&chatRoom, "Alice");User user2(&chatRoom, "Bob");User user3(&chatRoom, "Tom");// 将用户添加到聊天室中chatRoom.addUser(&user1);chatRoom.addUser(&user2);chatRoom.addUser(&user3);// 用户发送消息user1.sendMessage("Hello Bob!");//user2.sendMessage("Hi Alice!");return a.exec();
}

运行效果:

"Alice"  sends:  "Hello Bob!"
"Bob"  receives:  "Hello Bob!"
"Tom"  receives:  "Hello Bob!"

3.应用

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

  • GUI框架中,例如Qt,其中各种控件可能需要相互通讯但又不希望直接依赖对方。
  • 多模块或分布式系统中,各个模块或节点之间的通信可以由中介者集中管理。
  • 状态管理器或控制器层,用于管理不同视图组件的状态更新和事件分发。

4.优缺点及适用环境

优点:

  • 减少依赖:减少了同事对象之间的直接依赖,降低了系统的耦合度。
  • 简化交互:通过中介者集中管理对象间的交互,使得代码更加清晰易读。
  • 易于扩展:新增同事对象时不需要修改现有的同事对象,只需调整中介者即可。

缺点:

  • 复杂性增加:如果中介者变得过于复杂,可能会成为系统的瓶颈,同时也会增加维护成本。
  • 单一职责原则:如果中介者承担过多的责任,可能会导致其变得庞大且难以管理。

应用环境:

  • 当系统中有大量对象需要相互通信,但你希望避免它们之间的直接引用时。
  • 对于那些希望通过引入中介者来提高模块独立性的系统来说,中介者模式是一个很好的选择。
  • 在开发复杂的GUI应用程序时,使用中介者模式可以帮助更好地管理和控制组件之间的交互。

      通过职责链模式,我们可以构建更加灵活、易于扩展的应用程序,尤其是在涉及多种类型的请求处理时。然而,在使用此模式时也应注意其可能带来的性能损耗和复杂性的增加。

5.举一反三

中介者模式因其能有效减少对象间的直接依赖和简化复杂的交互逻辑,适用于多种场景。以下是一些可以应用中介者模式的具体例子及其应用场景:

1. GUI应用程序

在Qt或其他GUI框架中,组件(如按钮、文本框等)之间的交互往往比较复杂。使用中介者模式可以帮助管理这些交互,避免组件间直接相互引用。

  • 示例:在一个表单中,某些输入框的可用性可能取决于其他输入框的内容或状态。例如,选择“是否需要发票”复选框后,相关的税号输入框才变为可编辑状态。通过引入一个中介者来监听这些事件并更新相应的UI组件状态,可以使代码更加清晰且易于维护。

2. 分布式系统中的模块通信

在分布式系统或微服务架构中,各个服务或模块之间需要进行通信。为了避免服务之间的直接依赖,可以通过引入中介者(如消息队列或API网关)来解耦这些服务。

  • 示例:在一个电商系统中,订单服务、库存服务和支付服务都需要相互通信以完成下单流程。使用中介者模式可以确保这些服务不直接相互调用,而是通过中介者传递消息,从而提高了系统的灵活性和可扩展性。

3. 游戏开发中的物体交互

在游戏中,不同游戏物体(如角色、敌人、道具等)之间的交互非常频繁。使用中介者模式可以帮助管理这些交互,特别是当涉及到多个物体同时对同一事件作出反应时。

  • 示例:在一个多人在线游戏中,当玩家捡起一件装备时,不仅该玩家的状态会发生变化,其他玩家也可能看到这一变化。通过引入一个中介者来协调这些状态更新,可以有效地管理复杂的同步逻辑。

4. 状态管理和事件分发

在具有复杂状态的应用程序中,比如企业级应用或大型网站,状态的变化可能会影响到多个视图或组件。使用中介者模式可以帮助集中管理这些状态变化,并通知相关联的视图或组件进行更新。

  • 示例:在一个具有多个视图的单页应用(SPA)中,用户登录状态的变化可能会影响导航栏、侧边栏等多个地方。通过使用中介者来处理这种状态变化,并向所有相关视图广播通知,可以使状态管理更加简洁高效。

5. 智能家居控制系统

智能家居设备(如灯光、温度控制器、安全系统等)通常需要根据环境变化或其他设备的状态自动调整其行为。使用中介者模式可以使得这些设备之间的交互更加灵活和独立。

  • 示例:当智能门锁检测到有人进入房屋时,它可以通过中介者通知室内照明系统开启特定区域的灯光,并告知温控器调整室温。这种方式既实现了设备间的解耦,又保证了响应的及时性和准确性。

总之,中介者模式非常适合用于那些需要管理多个对象间复杂交互的场景,特别是在希望减少对象间直接依赖、提高模块独立性以及简化交互逻辑的情况下。通过合理地应用中介者模式,可以构建出更加灵活、易于维护和扩展的软件系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬取网站内容转为markdown 和 html(通常模式)

我们遇到一些自己喜欢内容&#xff0c;想保存下来&#xff0c;手动复制粘贴很麻烦&#xff0c;我们使用 python 来爬取这些内容。 一、代码 downlod.py import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin# 目标网页&#xff08;可…

高效执行自动化用例:分布式执行工具pytest-xdist实战!

01、声明 在介绍pytest-xdist时&#xff0c;不讲任何原理&#xff0c;需要看原理的请移至官方&#xff1a;https://pypi.org/project/pytest-xdist/ 当我们自动化测试用例非常多的时候&#xff0c; 一条条按顺序执行会非常慢&#xff0c;pytest-xdist的出现就是为了让自动化测…

deepseek多列数据对比,联想到excel的高级筛选功能

目录 1 业务背景 ​2 deepseek提示词输入 ​3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题&#xff0c;系统导入的数据和线下的EXCEL数据是否一致&#xff0c;如果不一致&#xff0c;如何快速找到差异值&#xff0c;原来脑海第一反应就是使用公…

个人博客测试报告

一、项目背景 个人博客系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&#xff0c;同时将其部署到云服务器上。前端主要有四个页面构成&#xff1a;登录页、列表页、详情页以及编辑页&#xff0c;以上模拟实现了最简单的个人博客系统。其结合后…

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表 链表是一种线性数据结构&#xff0c;由一系列按特定顺序排列的节点组成&#xff0c;这些节点通过指针相互连接。每个节点包含两部分&#xff1a;元素和指向下一个节点的指针。其中&#xff0c;最简单的形式是单向链表&#xff0c;每个节点含有一个信息域和一个指针域&…

夜莺监控发布 v8.beta5 版本,优化 UI,新增接口认证方式便于鉴权

以防读者不了解夜莺&#xff0c;开头先做个介绍&#xff1a; 夜莺监控&#xff0c;英文名字 Nightingale&#xff0c;是一款侧重告警的监控类开源项目。类似 Grafana 的数据源集成方式&#xff0c;夜莺也是对接多种既有的数据源&#xff0c;不过 Grafana 侧重在可视化&#xff…

SQLMesh 系列教程5- 详解SQL模型

本文将详细介绍 SQLMesh 的 SQL 模型组成要素及其在实际项目中的应用。SQLMesh 是一个强大的数据工程工具&#xff0c;其 SQL 模型由 MODEL DDL、预处理语句、主查询、后处理语句以及可选的 ON VIRTUAL UPDATE 语句组成。我们将通过一个电商平台每日销售报告的实例&#xff0c;…

DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方DeepSeek接入)

前言 在当今数字化时代&#xff0c;AI编程助手已成为提升开发效率的利器。DeepSeek作为一款强大的AI模型&#xff0c;凭借其出色的性能和开源免费的优势&#xff0c;成为许多开发者的首选。今天&#xff0c;就让我们一起探索如何将DeepSeek接入PyCharm&#xff0c;实现高效、智…

从驾驶员到智能驾驶:汽车智能化进程中的控制与仿真技术

在汽车技术持续演进的历程中&#xff0c;人类驾驶员始终是一个极具研究价值的智能控制系统“原型”。驾驶员通过视觉感知、行为决策与操作执行的闭环控制&#xff0c;将复杂的驾驶任务转化为车辆的实际动作&#xff0c;同时动态适应道路环境的变化。这一过程不仅体现了高度的自…

华为FusionCompute虚拟化平台

一、华为FusionCompute虚拟化套件介绍 华为FusionCompute虚拟化套件是业界领先的虚拟化解决方案&#xff0c;能够帮助客户带来如下的价值&#xff0c;从而大幅提升数据中心基础设施的效率。 帮助客户提升数据中心基础设施的资源利用率&#xff1b;帮助客户成倍缩短业务上线周期…

【存储中间件API】MySQL、Redis、MongoDB、ES常见api操作及性能比较

常见中间件api操作及性能比较 ☝️ MySQL crud操作✌️ maven依赖✌️ 配置✌️ 定义实体类✌️ 常用api ☝️ Redis crud操作✌️ maven依赖✌️ 配置✌️ 常用api ☝️ MongoDB crud操作✌️ maven依赖✌️ 配置文件✌️ 定义实体类✌️ MongoDB常用api ☝️ ES crud操作 ⭐️…

51单片机入门_10_数码管动态显示(数字的使用;简单动态显示;指定值的数码管动态显示)

接上篇的数码管静态显示&#xff0c;以下是接上篇介绍到的动态显示的原理。 动态显示的特点是将所有位数码管的段选线并联在一起&#xff0c;由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选&#xff…

win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统&#xff0c;报错&#xff1a;Operating System not found 二、原因分析 国产系统&#xff0c;需要注意的点&#xff1a; 需要看你的系统类…

情书网源码 情书大全帝国cms7.5模板

源码介绍 帝国cms7.5仿《情书网》模板源码&#xff0c;同步生成带手机站带采集。适合改改做文学类的网站。 效果预览 源码获取 情书网源码 情书大全帝国cms7.5模板

STM32 ADC介绍(硬件原理篇)

目录 背景 AD转换器 采样与保持 量化 编码 AD转换器转换原理 DA转换原理 AD转换原理 1.逐次逼近型AD转换器 2.并联比较型AD转换器 编码器 同步D触发器和边沿D触发器 基本RS触发器 同步RS触发器 同步D触发器 边沿型D触发器&#xff08;维持-阻塞D触发器&#xff…

公网远程家里局域网电脑过程详细记录,包含设置路由器。

由于从校内迁居小区,校内需要远程控制访问小区内个人电脑,于是早些时间刚好自己是电信宽带,可以申请公网ipv4不需要花钱,所以就打电话直接申请即可,申请成功后访问光猫设备管理界面192.168.1.1,输入用户名密码登录超管(密码是网上查下就有了)设置了光猫为桥接模式,然后…

【Spring】Spring配置文件

目录 ​什么是配置文件&#xff1f; 配置文件的作用 SpringBoot配置文件 配置文件格式 配置文件的优先级 properties配置文件说明 properties基本语法 读取配置文件 properties缺点 yml配置文件说明 yml基本语法 使用yml连接数据库 yml配置不同数据类型及null 注意…

Visual Studio Code使用ai大模型编成

1、在Visual Studio Code搜索安装roo code 2、去https://openrouter.ai/settings/keys官网申请个免费的配置使用

解锁机器学习核心算法 | 支持向量机:机器学习中的分类利刃

一、引言 在机器学习的庞大算法体系中&#xff0c;有十种算法被广泛认为是最具代表性和实用性的&#xff0c;它们犹如机器学习领域的 “十大神器”&#xff0c;各自发挥着独特的作用。这十大算法包括线性回归、逻辑回归、决策树、随机森林、K - 近邻算法、K - 平均算法、支持向…

深入解析Qt事件循环

在Qt开发中&#xff0c;QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作&#xff1f;为何耗时操作会导致界面冻结&#xff1f;本文将以事件循环为核心&#xff0c;揭示Qt高效运转的底层逻辑&#xff0c;探讨其设计哲学与最…