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.结果分析
- 当
John
发送消息"Hi there!"
给聊天室时,中介者(聊天室)将这个消息转发给了Jane
。 - 同样地,当
Jane
发送消息"Hey!"
给聊天室时,中介者将这个消息转发给了John
。
- Mediator: 聊天室是中介者,它管理着用户之间的通信。它通过
chatRoomSend
函数实现消息转发。 - Colleagues (Users): 用户
John
和Jane
是同事,它们通过中介者进行通信。每个用户都有自己的send
和receive
方法。 - 创建和加入聊天室: 在主函数中,我们创建了两个用户并将它们添加到了聊天室中。
- 发送消息: 用户通过调用自身的
send
方法发送消息。这实际上会调用中介者的send
方法,进而将消息转发给除了发送者以外的其他用户。 - 接收消息: 每个用户都有一个
receive
方法,用来接收从中介者那里转发过来的消息。