wordpress短信通知上海做网站seo

diannao/2026/1/25 17:32:17/文章来源:
wordpress短信通知,上海做网站seo,一个网站的构建,做mod的网站1 中介者模式的基本概念 C中的中介者模式#xff08;Mediator Pattern#xff09;是一种行为型设计模式#xff0c;主要用于降低多个对象和类之间的通信复杂性。这种模式通过引入一个中介类来封装和处理不同类之间的通信#xff0c;从而实现松耦合#xff0c;使代码更易于…1 中介者模式的基本概念 C中的中介者模式Mediator Pattern是一种行为型设计模式主要用于降低多个对象和类之间的通信复杂性。这种模式通过引入一个中介类来封装和处理不同类之间的通信从而实现松耦合使代码更易于维护。 在中介者模式中各个对象不需要显式地相互引用而是通过中介者进行通信。这样对象之间的依赖关系被简化降低了类的复杂度并将一对多的依赖关系转化成了一对一的依赖关系。同时这也符合迪米特原则即一个对象应当对其他对象有最少的了解。 然而需要注意的是如果中介者变得过于庞大和复杂可能会导致其本身的维护变得困难。因此在职责混乱的情况下不应使用中介者模式。 在中介者模式中主要涉及到以下几个角色 1中介者Mediator 中介者类是整个模式的核心它负责协调各个同事对象之间的交互降低了同事之间的耦合度。中介者类通常知道所有的同事对象并可以在同事对象之间传递消息。中介者可以独立地改变它们之间的交互方式使得对象之间的交互更加灵活。 2同事类Colleague 同事类也称为关联类是那些需要相互通信的对象。同事类不需要直接与其他同事类通信而是通过中介者来进行交互。同事类通常知道中介者的存在并可以通过中介者发送和接收消息。 3抽象中介者AbstractMediator 这是一个中介者的抽象父类定义了中介者的通用接口和行为。具体的中介者类会继承自这个抽象类并实现具体的交互逻辑。 4具体中介者ConcreteMediator 具体中介者类是中介者的具体实现它包含了与同事类交互的具体逻辑。具体中介者知道所有的同事对象并可以协调它们之间的交互。 5抽象同事类AbstractColleague 这是一个同事类的抽象父类定义了同事类的通用接口和行为。具体的同事类会继承自这个抽象类并实现具体的交互逻辑。 6具体同事类ConcreteColleague 具体同事类是同事类的具体实现它包含了与中介者和其他同事类交互的具体逻辑。具体同事类通过中介者来发送和接收消息实现与其他同事类的通信。 2 中介者模式的实现步骤 中介者模式的实现步骤如下 1定义抽象中介者类 创建一个抽象中介者类定义用于同事类之间通信的方法。这些方法可能包括注册同事、接收来自同事的消息、并转发给相应的同事等。 2定义具体中介者类 继承自抽象中介者类并实现其中的方法。具体中介者类将负责存储和管理同事类对象协调它们之间的交互。 3定义抽象同事类 创建一个抽象同事类定义一个接口用于与中介者进行通信。同事类将通过中介者来发送和接收消息而不是直接与其他同事类交互。 4定义具体同事类 继承自抽象同事类并实现其中的方法。具体同事类将包含与中介者进行通信的代码例如发送消息或接收来自中介者的通知。 5在同事类中使用中介者 在具体同事类的实现中创建对中介者的引用或指针并通过中介者发送和接收消息。同事类不再直接与其他同事类通信而是将消息传递给中介者由中介者负责转发。 6初始化中介者和同事类 在程序初始化时创建具体中介者对象和具体的同事类对象。将同事类对象注册到中介者中以便中介者能够管理和协调它们之间的交互。 7实现中介者的协调逻辑 在具体中介者类中实现协调同事类交互的逻辑。当接收到来自同事类的消息时中介者根据消息类型和接收者信息将消息转发给相应的同事类。 如下为样例代码 #include iostream #include memory #include vector #include string class AbstractColleague;// 抽象中介者类 class AbstractMediator { public:virtual ~AbstractMediator() default;virtual void registerColleague(const std::shared_ptrAbstractColleague colleague) 0;virtual void colleagueChanged(const std::shared_ptrAbstractColleague colleague) 0; };// 抽象同事类 class AbstractColleague : public std::enable_shared_from_thisAbstractColleague { public:AbstractColleague(const std::shared_ptrAbstractMediator mediator) : mediator(mediator) {}virtual ~AbstractColleague() default;virtual void send(const std::string message) 0;virtual void receive(const std::string message) 0;void setMediator(const std::shared_ptrAbstractMediator mediator) { this-mediator mediator; }protected:std::weak_ptrAbstractMediator mediator; };// 具体中介者类 class ConcreteMediator : public AbstractMediator { public:void registerColleague(const std::shared_ptrAbstractColleague colleague) override {colleagues.push_back(colleague);}void colleagueChanged(const std::shared_ptrAbstractColleague colleague) override {for (const auto c : colleagues) {if (c ! colleague) {c-receive(Someone has changed);}}}private:std::vectorstd::shared_ptrAbstractColleague colleagues; };// 具体同事类 class ConcreteColleague : public AbstractColleague { public:ConcreteColleague(const std::string name, const std::shared_ptrAbstractMediator mediator): AbstractColleague(mediator), name(name) {}void send(const std::string message) override {std::cout name sends: message std::endl;if (auto med mediator.lock()) {med-colleagueChanged(shared_from_this());}}void receive(const std::string message) override {std::cout name receives: message std::endl;}private:std::string name; };int main() {// 创建中介者对象 auto mediator std::make_sharedConcreteMediator();// 创建同事类对象并将中介者注入 auto colleagueA std::make_sharedConcreteColleague(ColleagueA, mediator);auto colleagueB std::make_sharedConcreteColleague(ColleagueB, mediator);// 注册同事类到中介者 mediator-registerColleague(colleagueA);mediator-registerColleague(colleagueB);// 同事类通过中介者进行通信 colleagueA-send(Hello from A);return 0; }上面代码的输出为 ColleagueA sends: Hello from A ColleagueB receives: Someone has changed这个例子定义了一个 AbstractMediator 抽象中介者类和一个 ConcreteMediator 具体中介者类。同样地例子中也定义了 AbstractColleague 抽象同事类和一个 ConcreteColleague 具体同事类。 ConcreteColleague 类中的 send 方法发送消息并通过中介者通知其他同事类有变化发生。receive 方法用于接收来自中介者的消息。 在 main 函数中创建了一个 ConcreteMediator 对象和两个 ConcreteColleague 对象并将中介者的智能指针传递给同事类。然后注册同事类到中介者并通过 send 方法让同事类A发送消息。中介者接收到消息后会通知所有其他同事类有变化发生。 3 中介者模式的应用场景 C 中介者模式的应用场景广泛主要适用于以下情况 1事件驱动的系统 在事件驱动的系统中中介者模式可以用于管理事件的分发和处理。中介者可以接收来自不同对象的事件并根据事件的类型和接收者信息将事件转发给相应的对象进行处理。 2对象间交互复杂 当多个对象之间存在错综复杂的交互关系并且这些交互关系导致代码难以理解和维护时可以使用中介者模式来简化这些交互。通过引入一个中介者对象可以将对象之间的直接交互转化为通过中介者进行间接交互从而降低对象之间的耦合度。 3系统需要灵活配置 当系统中的对象交互方式需要经常变更时使用中介者模式可以使得这些变更更加容易实现。中介者模式允许独立地改变对象之间的交互方式而不需要修改大量的代码。 具体示例包括但不限于聊天程序、GUI 编程、网络编程等场景。在聊天程序中多个用户对象和一个聊天室对象可以通过中介者模式进行通信用户对象之间不直接通信而是通过聊天室对象进行消息的发送和接收。这样可以有效地解耦用户对象和聊天室对象提高代码的可维护性和可扩展性。 3.1 中介者模式应用于事件驱动的系统 在事件驱动的系统中中介者模式非常适合用于管理事件的分发和处理。下面是一个中介者模式应用于事件驱动系统的样例这个样例模拟了一个简单的 GUI 系统其中按钮Button和文本框TextBox通过事件中介者EventManager来交互。 首先定义事件和事件监听器的接口 #include iostream #include memory #include functional #include unordered_map #include string #include algorithm // 事件类型 enum class EventType {BUTTON_CLICKED,TEXT_CHANGED };// 事件基类 class Event { public:virtual EventType getType() const 0;virtual ~Event() default; };// 点击事件 class ButtonClickedEvent : public Event { public:ButtonClickedEvent(const std::string buttonName) : buttonName(buttonName) {}EventType getType() const override { return EventType::BUTTON_CLICKED; }const std::string getButtonName() const { return buttonName; }private:std::string buttonName; };// 文本改变事件 class TextChangedEvent : public Event { public:TextChangedEvent(const std::string textBoxName, const std::string newText): textBoxName(textBoxName), newText(newText) {}EventType getType() const override { return EventType::TEXT_CHANGED; }const std::string getTextBoxName() const { return textBoxName; }const std::string getNewText() const { return newText; }private:std::string textBoxName;std::string newText; };// 事件监听器接口 class EventListener { public:virtual void handleEvent(const std::shared_ptrEvent event) 0;virtual ~EventListener() default; };接着定义事件中介者EventManager和可以注册监听器并触发事件的组件如 Button 和 TextBox // 事件中介者 class EventManager { public:using EventListenerPtr std::shared_ptrEventListener;using EventPtr std::shared_ptrEvent;void registerListener(const std::string eventName, const EventListenerPtr listener) {listeners[eventName].push_back(listener);}void unregisterListener(const std::string eventName, const EventListenerPtr listener) {auto it listeners.find(eventName);if (it ! listeners.end()) {auto it2 std::remove_if(it-second.begin(), it-second.end(), [](const EventListenerPtr listener_) {return listener_ listener; });it-second.erase(it2, it-second.end());}}void triggerEvent(const EventPtr event) {std::string eventName getEventName(event-getType());for (const auto listener : listeners[eventName]) {listener-handleEvent(event);}}private:static std::string getEventName(EventType type) {switch (type) {case EventType::BUTTON_CLICKED: return BUTTON_CLICKED;case EventType::TEXT_CHANGED: return TEXT_CHANGED;default: return UNKNOWN_EVENT;}}std::unordered_mapstd::string, std::vectorEventListenerPtr listeners; };// 按钮类 class Button { public:Button(const std::string name, const EventManager::EventListenerPtr listener): name(name), clickedListener(listener) {}void onClick() {auto event std::make_sharedButtonClickedEvent(name);clickedListener-handleEvent(event);}private:std::string name;EventManager::EventListenerPtr clickedListener; };// 文本框类 class TextBox { public:TextBox(const std::string name, const EventManager::EventListenerPtr listener): name(name), textChangedListener(listener) {}void setText(const std::string newText) {auto event std::make_sharedTextChangedEvent(name, newText);textChangedListener-handleEvent(event);}private:std::string name;EventManager::EventListenerPtr textChangedListener; };最后创建具体的监听器实现并展示如何使用这些组件和中介者 // 具体的监听器实现 class TextBoxListener : public EventListener { public:void handleEvent(const std::shared_ptrEvent event) override {if (event-getType() EventType::BUTTON_CLICKED) {auto clickedEvent std::static_pointer_castButtonClickedEvent(event);std::cout TextBoxListener: Button clickedEvent-getButtonName() was clicked! std::endl;// 响应按钮点击事件比如更新文本框内容等}} };int main() {// 创建事件中介者EventManager eventManager;// 创建监听器 auto textBoxListener std::make_sharedTextBoxListener();// 创建按钮并注册监听器 Button button(MyButton, textBoxListener);// 注册事件到中介者 eventManager.registerListener(BUTTON_CLICKED, textBoxListener);// 模拟按钮点击事件 button.onClick();return 0; }上面代码的输出为 TextBoxListener: Button MyButton was clicked!3.2 中介者模式应用于对象间交互复杂 以一个聊天室应用为例其中多个用户对象通过聊天室中介者进行交互。以下是一个简化版的C样例展示了如何使用中介者模式来处理用户之间的消息传递。 首先定义用户User类它能够发送消息 #include iostream #include memory #include string #include vector class AbstractChatRoom { public:virtual void sendMessage(const std::string sender, const std::string message) 0; };class User { public:User(const std::string name, std::shared_ptrAbstractChatRoom chatRoom): m_name(name), m_chatRoom(chatRoom) {}void sendMessage(const std::string message) {m_chatRoom-sendMessage(m_name, message);}void receiveMessage(const std::string sender, const std::string message) {std::cout sender : message std::endl;}std::string getName() {return m_name;}private:std::string m_name;std::shared_ptrAbstractChatRoom m_chatRoom; };接下来定义聊天室ChatRoom类作为中介者 class ChatRoom : public AbstractChatRoom { public:void registerUser(const std::shared_ptrUser user) {m_users.push_back(user);}void sendMessage(const std::string sender, const std::string message) override {for (const auto user : m_users) {if (user-getName() ! sender) {user-receiveMessage(sender, message);}}}private:std::vectorstd::shared_ptrUser m_users; };现在可以创建一个主程序来模拟多个用户通过聊天室进行交互 int main() {// 创建聊天室中介者 std::shared_ptrChatRoom chatRoom std::make_sharedChatRoom();// 创建用户并注册到聊天室 std::shared_ptrUser user1 std::make_sharedUser(Alice, chatRoom);std::shared_ptrUser user2 std::make_sharedUser(Bob, chatRoom);std::shared_ptrUser user3 std::make_sharedUser(Charlie, chatRoom);chatRoom-registerUser(user1);chatRoom-registerUser(user2);chatRoom-registerUser(user3);// 用户发送消息 user1-sendMessage(Hello, everyone!);user2-sendMessage(Hi, Alice. Whats up?);user3-sendMessage(Im good, thanks. Nice to meet you all.);return 0; }上面代码的输出为 Alice: Hello, everyone! Alice: Hello, everyone! Bob: Hi, Alice. Whats up? Bob: Hi, Alice. Whats up? Charlie: Im good, thanks. Nice to meet you all. Charlie: Im good, thanks. Nice to meet you all.这个样例中创建了三个用户Alice、Bob 和 Charlie并将它们注册到聊天室中。每个用户都可以发送消息消息通过聊天室中介者传递给其他所有用户。这样用户之间不需要直接交互而是通过中介者进行通信从而简化了对象间的交互。 4 中介者模式的优点与缺点 C 中介者模式的优点主要包括 1降低对象间的耦合度 通过中介者对象进行通信减少了对象之间的直接依赖降低了系统的耦合度。这使得对象可以更加独立地改变和复用提高了系统的灵活性和可维护性。 2简化对象间的交互 中介者模式将多个对象之间的复杂交互关系转换为中介者与对象之间的一对多关系使得对象之间的交互变得简单和清晰。这有助于降低代码的复杂性提高代码的可读性和可维护性。 3集中控制交互 通过中介者对象可以对对象间的交互进行集中控制和管理。这使得系统更容易进行协调、监控和扩展。 4易于添加新对象 当系统中需要添加新的对象时只需要将该对象与中介者对象建立联系而不需要修改其他对象。这降低了添加新对象的难度和成本。 然而C 中介者模式也存在一些缺点 1可能导致中介者对象过于复杂 如果系统中对象间的交互关系非常复杂中介者对象可能会变得庞大和复杂难以管理和维护。这可能会抵消掉降低对象间耦合度带来的优势。 2可能产生过多的中介者 如果系统中有多个不同类型的交互关系可能需要创建多个中介者对象来分别处理这些关系。这会增加系统的复杂性和管理成本。 3对中介者的依赖 系统中的对象都需要依赖于中介者对象进行交互这增加了对中介者的依赖。如果中介者对象出现问题或失效整个系统可能会受到影响。 4不适用于所有场景 虽然中介者模式在某些场景下非常有用但并不是所有场景都适合使用中介者模式。在一些简单的系统中对象间的交互关系并不复杂使用中介者模式可能会引入不必要的复杂性和开销。

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

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

相关文章

做育儿类网站用什么程序好深圳高端写字楼

“Allins正在通过全新的AMM方案为BRC20及多链铭文资产拓展DeFi场景,官网的全新上线意味着铭文资产的交易正式进入AMM时代。” 在2023年1月开始,Ordinals协议的推出成为了铭文赛道发展的开端,并为比特币这类非图灵完备的生态,带来了…

免费做h5的网站有哪些朔州建设机械网站

alipay.fund.trans.tobank.transfer(单笔转账到银行账户接口) 小程序文档 - 支付宝文档中心 一、下载支付宝SDK,现有版本v1、v2、v3 https://github.com/alipay/alipay-sdk-php-all github 慢的话,DNS 直达即可 140.82.112.3 github.com 【host文…

php做用户登录网站企业所得税怎么征收2022政策

人工智能工具使公司能够共享候选药物数据,同时保证敏感信息的安全,可以释放机器学习和尖端实验室技术的潜力,以实现共同利益。来自:AI can help to speed up drug discovery — but only if we give it the right data, nature, 2023 目录 研究内容生物科技与AI联邦学习主动…

网站备案每年审吗网站建设费属于哪个会计科目

现代城市作为一个复杂系统,牵一发而动全身,城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。城市工作要树立系统思维,从构成城市诸多要素、结构、功能等方面入手,系统推进…

如何给网站加二级域名网站可以用什么做

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 INSTEAD OF 触发器,也称替换触发器,是一种特殊的触发器,和其他建立在数据表上的触发器不同,INSTEAD OF 触发器建立在视图上。…

怎么选择郑州网站建设wordpress怎样切换语言

编码&解码 1:I/O操作 2:内存 3:数据库 4:javaWeb 下面主要介绍前面两种场景,数据库部分只要设置正确编码格式就不会有什么问题,javaWeb场景过多需要了解URL、get、POST的编码,servlet的解码…

企业网站的搭建流程wordpress 主域名

tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据 在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大…

网站下载的网页修改下面版权所有苏州市城乡建设局网站

vscode安装插件:JavaScript Debugger (Nightly) 点击后生成一个launch.json文件 打断点,并发送一个请求来执行代码到断点处 按右上的向下箭头,进入源码,进行查看,左边查看变量等值

乐昌北京网站建设嘉兴免费自助建站模板

1作家李尚龙说:“在大城市里,搞废一个人的方式特别简单。给你一个安静狭小的空间,给你一根网线,最好再加一个外卖电话。好了,你开始废了。”之前的我并不相信人会这么轻易地堕落,直到身边出现了一个真实的例…

某服装公司网站建设论文php网站开发案例论文

目录 1.nacos环境搭建nacos安装 2.项目主体结构6.2)表结构分析6.4)**运营端微服务搭建**6.4)登录功能实现 7)接口工具postman、swagger、knife4j7.1)postman7.2)swagger7.3)knife4j 8)网关9)前端集成9.1)前端项目部署思路9.2)配置nginx 1.nacos环境搭建 nacos安装 ①&#xf…

职业培训学校seo视频教程汇总

1. 题目 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n 1 输出: [1,2,3,4,5,6,7,8,9]说明: 用返回一个整数列表来代替打印 n 为正整数来源:力扣…

个人网站 不用备案兴县做网站

文章目录 前言Job的基本概念什么是Job?Job的主要作用 Job的详细示例示例:运行批量处理任务的JobJob的定义创建Job查看Job状态查看任务执行日志任务的重试 Job的最佳实践 结论 前言 Kubernetes(K8s)作为领先的容器编排平台&#x…

河北网站seo地址东营有网站

HTML5 新标签总汇 2010-12-16 20:44 聂微东 阅读(5060) 评论(8) 编辑 收藏 HTML5新标签总汇&#xff1a; 有问题欢迎指出,有关于CSS3方面的知识点较多,下周一前整理出来. <article> 标签定义外部的内容&#xff08;外部内容如blog,news&#xff09;。     …

使用oss图片做网站企业网站开发用什么语言写

8.3string流 sstream头文件定义了三个类型来支持内存IO,这些类型可以向string写入数据,从string读取数据&#xff0c;就像string是一个IO流一样。istringstream从string读取数据&#xff0c;ostringstream向string写入数据&#xff0c;而头文件stringstream既可从string读数据…

php网站开发教材网易云网站开发

「Author&#xff1a;By Runsen」在很多时候&#xff0c;你会想要让你的程序与用户(可能是你自己)交互。你会从用户那里得到输入&#xff0c;然后打印一些结果。我们可以使用input和print语句来完成这些功能。inputname input(your name:)gender input(you are a boy?(y/n))…

肇庆有哪家做企业网站的北京建设信息港网站

由于某些原因&#xff0c;centos系统上的teamviewer不能运行。一直没有管它&#xff08;懒&#xff09;。 但是&#xff0c;突然看不下去了。因为每次开机后都自动启动&#xff0c;需要关闭&#xff0c;否则有问题。所以&#xff0c;uninstall。 尝试了很多都失败。尝试的步骤是…

如何做自己的网站链接官方网站平台有哪些

ROS 系列学习教程(总目录) 本文目录 1. 构造函数与关闭文件2. 属性值3. 写bag文件内容4. 读bag文件内容5. 将bag文件缓存写入磁盘6. 重建 bag 文件索引7. 获取bag文件的压缩信息8. 获取bag文件的消息数量9. 获取bag文件记录的起止时间10. 获取话题信息与消息类型 rosbag 的 Pyt…

上海住房和城乡建设部网站官网学做网站可以赚钱吗

有两种Java运行环境(JRE)&#xff0c;公有JRE (public JRE)与私有JRE(private JRE)。JDK安装程序会安装私有JRE和一个可选的公有JRE。私有JRE完全包含在JDK的安装路径下&#xff0c;仅对JDK可见&#xff0c;为JDK所用。公有JRE为系统中所有的Java程序共享&#xff0c;具有独立的…

wordpress多站点配置教程佛山做网站有哪几家

前段时间在调试FT-M6678和C6678的板卡&#xff0c;结果中途来了一个T2080网络配置的更改需求&#xff0c;就临时处理了一下&#xff0c;花了一点功夫&#xff0c;记录下来&#xff0c;为大家做个参考。 这个问题完成后&#xff0c;就得继续开发FT-M6678了~ uboot下面phy配置更…

素材网站哪个最好中国制造网站上的聊天怎么做

介绍 Laf 是一个完全开源的 Serverless 框架&#xff0c;Laf 的 Node.js 运行时容器 (以下简称为 Runtime) 是 Laf 的函数执行环境&#xff0c;依托于 Express.js 框架。采用容器进程常驻的方式&#xff0c;每一个应用对应于一个或多个容器 (弹性伸缩下)&#xff0c;底层使用了…