08-中介者模式-C语言实现

中介者模式: Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.(用一个中介对象封装一系列的对象交互, 中介者使各对象不需要显示地相互作用, 从而使其耦合松散, 而且可以独立地改变它们之间的交互。 )

UML图:

代码实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 中介者接口
typedef struct {
    void (*notify)(void*, char*);
} Mediator;

// 具体中介者类
typedef struct {
    Mediator mediator;
    char* name;
} ConcreteMediator;

void ConcreteMediator_notify(void* obj, char* message) {
    ConcreteMediator* self = (ConcreteMediator*)obj;
    printf("%s received message: %s\n", self->name, message);
}

ConcreteMediator createConcreteMediator(char* name) {
    ConcreteMediator mediator;
    mediator.mediator.notify = ConcreteMediator_notify;
    mediator.name = malloc(strlen(name) + 1);
    strcpy(mediator.name, name);
    return mediator;
}

// 抽象同事类
typedef struct {
    void (*send)(void*, char*);
    void (*receive)(void*, char*);
} Colleague;

// 具体同事类
typedef struct {
    Colleague colleague;
    Mediator* mediator;
    char* name;
} ConcreteColleague;

void ConcreteColleague_send(void* obj, char* message) {
    ConcreteColleague* self = (ConcreteColleague*)obj;
    printf("%s sends message: %s\n", self->name, message);
    self->mediator->notify(self->mediator, message);
}

void ConcreteColleague_receive(void* obj, char* message) {
    ConcreteColleague* self = (ConcreteColleague*)obj;
    printf("%s received message: %s\n", self->name, message);
}

ConcreteColleague createConcreteColleague(char* name, Mediator* mediator) {
    ConcreteColleague colleague;
    colleague.colleague.send = ConcreteColleague_send;
    colleague.colleague.receive = ConcreteColleague_receive;
    colleague.mediator = mediator;
    colleague.name = malloc(strlen(name) + 1);
    strcpy(colleague.name, name);
    return colleague;
}

int main() {
    ConcreteMediator mediator = createConcreteMediator("Mediator");
    ConcreteColleague colleague1 = createConcreteColleague("Colleague1", &mediator.mediator);
    ConcreteColleague colleague2 = createConcreteColleague("Colleague2", &mediator.mediator);

    colleague1.colleague.send(&colleague1, "Hello, Colleague2!");
    colleague2.colleague.send(&colleague2, "Hi, Colleague1!");

    free(mediator.name);
    free(colleague1.name);
    free(colleague2.name);

    return 0;
}

在上面的示例代码中,定义了中介者接口Mediator和具体中介者类ConcreteMediator,实现了通知方法来处理同事对象之间的交互。

同时还定义了抽象同事类Colleague和具体同事类ConcreteColleague,实现了发送和接收方法,并通过中介者对象来处理同事之间的交互。

main函数中,首先创建了一个具体中介者对象mediator,然后创建了两个具体同事对象colleague1colleague2,并将中介者对象传入。

然后通过调用同事对象的发送方法来向另一个同事对象发送消息,中介者对象将处理这些消息,最后输出了结果。

中介者模式的优点:

  1. 可以减少对象之间的直接依赖关系,使代码更加灵活,易于维护。

  2. 可以集中控制对象之间的交互逻辑,使代码更加清晰简洁。

  3. 可以降低系统的复杂度,提高系统的可维护性和可扩展性。

中介者模式的缺点:

  1. 中介者对象需要处理多个对象之间的交互逻辑,可能会导致中介者对象变得复杂。

  2. 中介者对象的存在会增加系统的开销,因为需要维护额外的对象和逻辑。

适用场景:

  1. 对象之间的交互逻辑比较复杂,存在大量的依赖关系。

  2. 对象之间的交互逻辑经常发生变化,需要进行频繁的修改。

  3. 系统的对象之间存在多对多的关系,难以维护。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2243:Knight Moves

文章目录 题目描述思路1. DFS2. BFS3. 动态规划 解题方法1. DFS2. BFS3. 动态规划 题目描述 题目链接 翻译如下&#xff1a; 注&#xff1a;骑士移动是和象棋里的马一样走的是日字型 你的一个朋友正在研究旅行骑士问题 &#xff08;TKP&#xff09;&#xff0c;你要找到最短的…

结合贝叶斯定理浅谈商业银行员工异常行为排查

1.贝叶斯定理的数学表达 贝叶斯方法依据贝叶斯定理。关于贝叶斯定理解释如下&#xff1a;首先我们设定在事件B条件下&#xff0c;发生事件A的条件概率&#xff0c;即 &#xff0c;从数学公式上&#xff0c;此条件概率等于事件A与事件B同时发生的概率除以事件B发生的概率。 上述…

VUE语法-(readonly的用法)将数据设置成只读模式

1、功能概述 在Vue中定义一个变量&#xff0c;这个变量的值不允许被修改&#xff0c;核心是通过readonly设置成只读。 如果不会使用ref和reactive响应式数据参考如下博客&#xff1a; https://blog.csdn.net/tangshiyilang/article/details/134701103 2、具体实现 如下案例…

轻量级万物分割SAM模型——MobileSAM安装实测摘要

目录 0、前言1、准备工作安装python环境说明安装说明 运行测试app安装依赖修改代码 2、实际测试效果自带图片测试其它图片测试1其它图片测试2 总结 0、前言 本文将介绍一种轻量级万物分割SAM模型——MobileSAM的安装和实测情况。SAM是meta公司的一种图像分割大模型&#xff0c…

摩根士丹利:人工智能推动增长

摩根士丹利&#xff08;NYSE&#xff1a;MS&#xff09;将人工智能战略整合到其财富管理业务中&#xff0c;标志着竞争性金融格局迈出了变革性的一步。该公司的人工智能计划&#xff0c;包括与 OpenAI 合作开发人工智能聊天机器人&#xff0c;促进了其财富部门的显着增长。值得…

VSCode 开发C/C++实用插件分享——codegeex

VSCode 开发C/C实用插件分享——codegeex 一、codegeex 一、codegeex CodeGeeX 智能编程助手是一款编程插件&#xff0c;CodeGeeX支持多种主流IDE&#xff0c;如VS Code、IntelliJ IDEA、PyCharm、Vim等&#xff0c;同时&#xff0c;支持Python、Java、C/C、JavaScript、Go等多…

C++学习之路(十六)C++ 用Qt5实现一个工具箱(为屏幕颜色提取功能增加一个点击复制的功能)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《颜色代码转换和屏幕颜色提取功能》功能。今天我们把屏幕颜色提取的功能再扩展一下&#xff0c;让它可以点击复制吧。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。 老规矩&#xff0c;先…

CKafka 一站式搭建数据流转链路,助力长城车联网平台降低运维成本

关于长城智能新能源 长城汽车是一家全球化智能科技公司&#xff0c;业务包括汽车及零部件设计、研发、生产、销售和服务&#xff0c;旗下拥有魏牌、哈弗、坦克、欧拉及长城皮卡。2022年&#xff0c;长城汽车全年销售1,067,523辆&#xff0c;连续7年销量超100万辆。长城汽车面向…

mysql手动事务

目录 &#x1f680;&#x1f680; 简要 手动事务使用案例 事务的特性 事务的隔离级别 脏读 不可重复读 幻读 查看事务隔离级别 设置隔离级别 &#x1fae1;&#x1fae1; 简要 mysq事务是自动提交的, 例如insert, update语句等 如下: 想要手动设置mysql事务就需…

操作系统导论——第36章 I/O设备

1. 系统架构 之所以使用分层&#xff0c;这是由于成本和效率之间的平衡 2. 标准设备 接口&#xff1a;向系统其他部分展现的硬件接口 内部结构&#xff1a;设备相关特定实现&#xff0c;几个芯片&#xff0c;CPU和通用内存等 3. 标准协议 While (STATUS BYSY); a、轮询设…

第三节:提供者、消费者、Eureka

一、 提供者 消费者&#xff08;就是个说法、定义&#xff0c;以防别人叭叭时听不懂&#xff09; 服务提供者&#xff1a;业务中被其他微服务调用的服务。&#xff08;提供接口给其他服务调用&#xff09;服务消费者&#xff1a;业务中调用其他微服务的服务。&#xff08;调用…

Windows系统下Elasticsearch-7.15.2安装

一、环境 此次笔记使用的运行环境以及软件版本 系统:WIN10 JDK版本&#xff1a;1.8 Elasticsearch版本&#xff1a;7.15.2 elasticsearch-head版本&#xff1a;最新 IK分词器版本&#xff1a;7.15.2 Kibana版本&#xff1a;7.15.2 二、Elasticsearch基本知识 2.1 介绍…

腾讯云优惠券领取入口及使用指南

腾讯云作为国内领先的云计算服务商&#xff0c;提供了丰富的云产品和服务。为了帮助用户更好地享受腾讯云的服务&#xff0c;腾讯云推出了各种优惠券&#xff0c;包括新用户优惠、老用户优惠等。本文将为大家介绍腾讯云优惠券的领取入口和使用指南。 一、腾讯云优惠券领取入口 …

Certum SSL证书

为了确保在线交易的安全性&#xff0c;以及保护敏感信息免受网络威胁&#xff0c;使用SSL&#xff08;Secure Socket Layer&#xff09;证书成为了必要选择。其中&#xff0c;波兰认证机构Certum提供的SSL证书以其高度的安全性和可信赖性&#xff0c;得到了全球用户的广泛认可。…

蓝桥杯物联网竞赛_STM32L071_6_RTC显示

作用&#xff1a; RTC在STM32微控制器中通常由一个独立的低功耗晶振和相关的寄存器组成。它可以独立于主处理器运行&#xff0c;即使在系统电源关闭的情况下(需要备用纽扣电池)&#xff0c;也能继续计时和记录日期。注意&#xff1a;RTC是芯片内部的功能&#xff0c;并没有和G…

网络运维与网络安全 学习笔记2023.12.2

网络运维与网络安全 学习笔记 第三十三天 今日目标 Linux系统综述、部署本地Linux、配置Linux网络 SSH远程控制、远程文档管理、选购ECS云主机 Linux系统综述 Linux是一种操作系统 Linux之父&#xff0c;Linus Torwalds 1991年10月&#xff0c;发布0.02版&#xff08;第一…

OOM了?物理内存不够了?试试这个方法来提升内存容量,不花钱的

通过增加虚拟内存来提高内存使用 本文解决的实际问题&#xff1a; 当我们物理内存小的时候&#xff0c;会出现OOM&#xff0c;然后服务自动死掉的情况。因为物理内存大小是固定的&#xff0c;有没有其他好的办法来解决呢&#xff1f;这里我们可以适当调整Linux的虚拟内存来协作…

FreeRTOS第2天:

1. 二值信号量简介&#xff08;386.11&#xff09; 什么是信号量&#xff1f; 信号量&#xff08;Semaphore&#xff09;&#xff0c;是在多任务环境下使用的一种机制&#xff0c;是可以用来保证两个或多个关键代码段不被并 发调用。信号量这个名字&#xff0c;我们可以把它拆…

Android BT HCI分析简介

对于蓝牙开发者来说&#xff0c;通过HCI log可以帮助我们更好地分析问题&#xff0c;理解蓝牙协议&#xff0c;就好像网络开发一定要会使用Wireshark分析网络协议一样。 本篇主要介绍HCI log的作用、如何抓取一份HCI log&#xff0c;并结合一个实际的例子来说明如何分析HCI log…

eclipse中设置自动补齐代码

eclipse中设置自动补齐代码 01 在window里找到preference 02 在preference里搜索content assist 03 在Java的content assist设置 设置为.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 04 apply and close即可