当前位置: 首页 > news >正文

中介者模式(大话设计模式)C/C++版本

中介者模式

C++

// 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示得相互引用,从而使得其耦合松散,而且可以独立地改变他们之间得交互#include <iostream>
#include <string>using namespace std;#define SAFE_DELETE(p) \if (p)             \{                  \delete p;      \p = NULL       \}class Mediator;// 抽象同事类
class Colleague
{
public:Colleague(Mediator *pMediator) : m_pMediator(pMediator){}; // 得到中介者对象virtual void Send(char *message) = 0;protected:Mediator *m_pMediator;
};// 具体同事1
class ConcreteColleague1 : public Colleague
{
public:ConcreteColleague1(Mediator *pMediator) : Colleague(pMediator){};virtual void Send(char *message);void Notify(char *message){cout << "同事1得到消息:" << message << endl;}
};
// 具体同事2
class ConcreteColleague2 : public Colleague
{
public:ConcreteColleague2(Mediator *pMediator) : Colleague(pMediator){};virtual void Send(char *message);void Notify(char *message){cout << "同事2得到消息:" << message << endl;}
};// 主管
class Mediator
{
public:virtual void Send(char *message, Colleague *pColleague) = 0;
};void ConcreteColleague1::Send(char *message)
{m_pMediator->Send(message, this);
}void ConcreteColleague2::Send(char *message)
{m_pMediator->Send(message, this);
}
// 具体主管
class ConcreteMediator : public Mediator
{
public:// 重写声明方法 实现了两个对象得通信void Send(char *message, Colleague *pColleague){ConcreteColleague1 *pConcreteColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);if (pConcreteColleague1){cout << "消息来自同事1" << endl;if (m_pColleague2){m_pColleague2->Notify(message);}}else{cout << "消息来自同事2" << endl;if (m_pColleague1){m_pColleague1->Notify(message);}}}// 具体主管了解改组下的所有得同事.... 所以拥有同事1和同事2得所有属性void setColleague1(Colleague *pColleague){m_pColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);}void setColleague2(Colleague *pColleague){m_pColleague2 = dynamic_cast<ConcreteColleague2 *>(pColleague);}private:ConcreteColleague1 *m_pColleague1; // 同事1ConcreteColleague2 *m_pColleague2; // 同事2
};int main(int argc, char **argv)
{Mediator *pMediator = new ConcreteMediator();Colleague *pColleague1 = new ConcreteColleague1(pMediator);Colleague *pColleague2 = new ConcreteColleague2(pMediator);ConcreteMediator *pConcreteMediator = dynamic_cast<ConcreteMediator *>(pMediator);pConcreteMediator->setColleague1(pColleague1);pConcreteMediator->setColleague2(pColleague2);char message1[128] = "你吃饭了吗?";pColleague1->Send(message1);char message2[128] = "还没呢";pColleague2->Send(message2);delete pColleague1;delete pColleague2;delete pMediator;return 0;
}

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef struct Mediator Mediator;
typedef struct Colleague Colleague;// 定义抽象同事
typedef struct Colleague
{void (*send)(Colleague *self, char *message);void (*notify)(Colleague *self, char *message);Mediator *mediator;
} Colleague;// 定义中介者
typedef struct Mediator
{void (*send)(Mediator *self, char *message, Colleague *pColleague);Colleague *colleague1;Colleague *colleague2;
} Mediator;// 创建同事
Colleague *create_colleague(void (*send)(Colleague *self, char *message),void (*notify)(Colleague *self, char *message))
{Colleague *colleague = malloc(sizeof(Colleague));colleague->send = send;colleague->notify = notify;colleague->mediator = NULL;return colleague;
}// 创建中介者
Mediator *create_mediator()
{Mediator *mediator = malloc(sizeof(Mediator));mediator->send = NULL;mediator->colleague1 = NULL;mediator->colleague2 = NULL;return mediator;
}// 具体同事1的发送函数
void concrete_colleague1_send(Colleague *self, char *message)
{self->mediator->send(self->mediator, message, self);
}// 具体同事1的通知函数
void concrete_colleague1_notify(Colleague *self, char *message)
{printf("同事1得到消息:%s\n", message);
}// 具体同事2的发送函数
void concrete_colleague2_send(Colleague *self, char *message)
{self->mediator->send(self->mediator, message, self);
}// 具体同事2的通知函数
void concrete_colleague2_notify(Colleague *self, char *message)
{printf("同事2得到消息:%s\n", message);
}// 具体中介者的发送函数
void concrete_mediator_send(Mediator *self, char *message, Colleague *pColleague)
{if (self->colleague1 == pColleague){printf("消息来自同事1\n");if (self->colleague2 != NULL){self->colleague2->notify(self->colleague2, message);}}else{printf("消息来自同事2\n");if (self->colleague1 != NULL){self->colleague1->notify(self->colleague1, message);}}
}int main()
{Mediator *mediator = create_mediator();mediator->send = concrete_mediator_send;Colleague *colleague1 = create_colleague(concrete_colleague1_send, concrete_colleague1_notify);Colleague *colleague2 = create_colleague(concrete_colleague2_send, concrete_colleague2_notify);colleague1->mediator = mediator;colleague2->mediator = mediator;mediator->colleague1 = colleague1;mediator->colleague2 = colleague2;char message1[] = "你吃饭了吗?";colleague1->send(colleague1, message1);char message2[] = "还没呢";colleague2->send(colleague2, message2);free(colleague1);free(colleague2);free(mediator);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • nginx的四层负载均衡实战
  • 基于全国产复旦微JFM7K325T+ARM人工智能数据处理平台
  • 实现多层感知机
  • c# 容器变换
  • DELTA: DEGRADATION-FREE FULLY TEST-TIME ADAPTATION--论文笔记
  • TS类型声明文件(一)如何在ts npm包项目中生成 d.ts 文件
  • 黑马头条微服务学习day01-环境搭建、SpringCloud微服务(注册发现、网关)
  • 【自动驾驶/机器人面试C++八股精选】专栏介绍
  • Java技术栈总结:kafka篇
  • 大模型高效参数微调技术
  • Bilibili Android一二面凉经(2024)
  • jenkins系列-06.harbor
  • 微软Win11 24H2七月更新补丁KB5040435发布!附下载
  • Python库 - Scrapy
  • AI机器人在未来的应用场景预测:是否会取代人类?华为、百度、特斯拉他们在AI领域都在做什么?
  • [NodeJS] 关于Buffer
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 08.Android之View事件问题
  • canvas 绘制双线技巧
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • java中的hashCode
  • mac修复ab及siege安装
  • mongo索引构建
  • MySQL QA
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • socket.io+express实现聊天室的思考(三)
  • 和 || 运算
  • 回顾 Swift 多平台移植进度 #2
  • 深入浅出webpack学习(1)--核心概念
  • 思考 CSS 架构
  • 微信开源mars源码分析1—上层samples分析
  • 我是如何设计 Upload 上传组件的
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​iOS安全加固方法及实现
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #NOIP 2014# day.2 T2 寻找道路
  • $(function(){})与(function($){....})(jQuery)的区别
  • $.ajax中的eval及dataType
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (20)docke容器
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (七)Knockout 创建自定义绑定
  • (十二)python网络爬虫(理论+实战)——实战:使用BeautfulSoup解析baidu热搜新闻数据
  • (十三)MipMap
  • (五)Python 垃圾回收机制
  • .Net IE10 _doPostBack 未定义
  • .NET 中的轻量级线程安全