设计模式专题之C语言-中介者模式

1.简介

中介者模式是一种行为设计模式,它定义了一个对象来封装一系列对象交互的方式。中介者模式减少了对象间的显式依赖关系,使得它们不需要相互引用就可以相互作用。这种模式简化了系统的维护和扩展。

2.通俗讲解

想象一个聊天室系统,其中多个用户可以互相发送消息。如果每个用户都需要知道其他所有用户的信息以便直接向他们发送消息,那么随着用户数量的增长,系统将变得难以管理和扩展。为了解决这个问题,我们可以引入一个“中介者”(聊天室服务器)来管理所有的通信。

3.实战

3.1.代码

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

// 定义中介者接口
typedef struct {
    void (*send)(void *sender, const char *msg);
} Mediator;

// 实现具体的中介者
typedef struct ChatRoom {
    void *users[100];
    size_t userCount;
} ChatRoom;

void chatRoomSend(void *sender, const char *msg) {
    for (size_t i = 0; i < ((ChatRoom *)sender)->userCount; i++) {
        if (((ChatRoom *)sender)->users[i] != sender) {
            ((User *)((ChatRoom *)sender)->users[i])->receive(msg);
        }
    }
}

Mediator *createMediator() {
    ChatRoom *chatRoom = malloc(sizeof(ChatRoom));
    chatRoom->userCount = 0;
    chatRoom->send = &chatRoomSend;
    return (Mediator *)chatRoom;
}

// 定义同事类 - 用户
typedef struct User {
    const char *name;
    Mediator *mediator;
    
    void (*send)(void *user, const char *msg);
    void (*receive)(void *user, const char *msg);
} User;

void userSend(void *user, const char *msg) {
    ((Mediator *)((User *)user)->mediator)->send(user, msg);
}

void userReceive(void *user, const char *msg) {
    printf("%s: received '%s'\n", ((User *)user)->name, msg);
}

User *createUser(const char *name, Mediator *mediator) {
    User *user = malloc(sizeof(User));
    user->name = strdup(name);
    user->mediator = mediator;
    user->send = &userSend;
    user->receive = &userReceive;
    return user;
}

void addUserToChatRoom(Mediator *mediator, User *user) {
    ChatRoom *chatRoom = (ChatRoom *)mediator;
    chatRoom->users[chatRoom->userCount++] = user;
}

int main() {
    Mediator *chatRoom = createMediator();

    User *john = createUser("John", chatRoom);
    User *jane = createUser("Jane", chatRoom);

    addUserToChatRoom(chatRoom, john);
    addUserToChatRoom(chatRoom, jane);

    john->send(john, "Hi there!");
    jane->send(jane, "Hey!");

    // 清理资源
    free(john->name);
    free(john);
    free(jane->name);
    free(jane);
    free(chatRoom);

    return 0;
}

3.2.代码解析

  • Mediator 接口定义了一个send方法,用于发送消息给其他同事。
  • ChatRoom 结构体实现了这个接口,并维护了一个用户列表。当一个用户发送消息时,chatRoomSend方法会遍历用户列表并将消息转发给除了发送者之外的所有用户。
  • User 结构体代表了聊天室中的用户。每个用户都有一个名字、指向中介者的指针以及发送和接收消息的方法。
  • main函数中,我们创建了一个聊天室实例和两个用户,然后让这两个用户加入聊天室,并互相发送消息。

3.3.代码运行

Jane: received 'Hi there!'
John: received 'Hey!'

3.4.结果分析

  1. 当 John 发送消息 "Hi there!" 给聊天室时,中介者(聊天室)将这个消息转发给了 Jane
  2. 同样地,当 Jane 发送消息 "Hey!" 给聊天室时,中介者将这个消息转发给了 John
  • Mediator: 聊天室是中介者,它管理着用户之间的通信。它通过chatRoomSend函数实现消息转发。
  • Colleagues (Users): 用户 John 和 Jane 是同事,它们通过中介者进行通信。每个用户都有自己的sendreceive方法。
  • 创建和加入聊天室: 在主函数中,我们创建了两个用户并将它们添加到了聊天室中。
  • 发送消息: 用户通过调用自身的send方法发送消息。这实际上会调用中介者的send方法,进而将消息转发给除了发送者以外的其他用户。
  • 接收消息: 每个用户都有一个receive方法,用来接收从中介者那里转发过来的消息。
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

甜航一直在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值