C++ 设计模式之中介者模式

C++ 设计模式之中介者模式

简介

1、中介者模式(Mediator)是一种行为型设计模式,它用于减少对象之间的直接耦合,使得这些对象可以松散地耦合在一起,并且可以通过一个中介者对象来间接地交互。中介者模式通常用于一组对象以定义良好但是复杂的方式进行通信的场合。

2、中介者模式 (Mediator)应用场景包括但不限于:
1、当一组对象以定义明确但复杂的方式交互时,特别是当你不想让这些交互形成一个“不明确的对象网”时。
2、当你想重用一个对象在不同的场景中,而这些场景需要大量不同的交互时。

3、中介者模式 (Mediator)的构成
3.1、中介者(Mediator):定义了一个接口,用于与各个同事对象通信,并封装了协调各个同事对象之间的交互行为。

class ChatRoom
{
public:
	virtual void sendMessage(const std::string& sender, const std::string& receiver, const std::string& message) = 0;
};

3.2、同事类:每一个同事类都知道中介者对象,并且与其他的同事对象通信时,一定要通过中介者对象协作。同事类之间一般不直接引用。

class User
{
public:
	User(ChatRoom* chat, std::string n);
	std::string GetName();
	ChatRoom* GetChatRoom();
	virtual void send(const std::string& message) = 0;
	virtual void receive(const std::string& sender, const std::string& message) = 0;

private:
	ChatRoom* mediator;
	std::string name;
};

4、中介者模式 (Mediator)的优点
4.1、降低系统复杂性: 中介者模式简化了对象之间的交互,使对象不需要显式地相互引用。
4.2、提升对象的复用性: 减少对象间依赖,有利于提高对象的可复用性。
4.3、集中控制交互: 将系统的交互复杂性集中到中介者中,使变更和维护变得更容易。
4.4、增强系统的可维护性:如果对象间的交互非常复杂,把这些交互逻辑放在中介者中可以集中管理,提高系统的可维护性。

5、中介者模式 (Mediator)的缺点
5.1、中介者可能过于复杂: 中介者自身可能变得复杂且难以维护,因为所有的交互逻辑都集中于一处。
5.2、过度集中化: 中介者控制了所有的交互,如果设计不当,可能导致中介者变成一个上帝对象,违反了单一职责原则。

简单示例

1、定义

// 中介者
class ChatRoom
{
public:
	virtual void sendMessage(const std::string& sender, const std::string& receiver, const std::string& message) = 0;
};

// 同事类
class User
{
public:
	User(ChatRoom* chat, std::string n);
	std::string GetName();
	ChatRoom* GetChatRoom();
	virtual void send(const std::string& message) = 0;
	virtual void receive(const std::string& sender, const std::string& message) = 0;

private:
	ChatRoom* mediator;
	std::string name;
};

// 具体中介者
class ConcreteChatRoom : public ChatRoom
{
public:
	void addUser(User* user);
	void sendMessage(const std::string& sender, const std::string& receiver, const std::string& message);

private:
	std::map<std::string, User*> users;
};

// 具体同事类
class ConcreteUser : public User
{
public:
	ConcreteUser(ChatRoom* chat, std::string n);
	void send(const std::string& message);
	void receive(const std::string& sender, const std::string& message);
};

2、实现

User::User(ChatRoom* chat, std::string n) : mediator(chat), name(n)
{

}

std::string User::GetName()
{
	return name;
}

ChatRoom* User::GetChatRoom()
{
	return mediator;
}

void ConcreteChatRoom::addUser(User* user)
{
	users[user->GetName()] = user;
}

void ConcreteChatRoom::sendMessage(const std::string& sender, const std::string& receiver, const std::string& message)
{
	if (receiver == "All")
	{
		for (auto user : users)
		{
			if (sender != user.first)
			{
				user.second->receive(sender, message);
			}
		}
	}
	else
	{
		if (users.find(sender) != users.end())
		{
			users[sender]->receive(sender, message);
		}
	}
}

ConcreteUser::ConcreteUser(ChatRoom* chat, std::string n) : User(chat, n)
{

}

void ConcreteUser::send(const std::string& message)
{
	GetChatRoom()->sendMessage(GetName(), "All", message);
}

void ConcreteUser::receive(const std::string& sender, const std::string& message)
{
	std::cout << GetName() << " received from " << sender << ": " << message << std::endl;
}

3、调用

ConcreteChatRoom chatRoom;
User* alice = new ConcreteUser(&chatRoom, "Alice");
User* bob = new ConcreteUser(&chatRoom, "Bob");

chatRoom.addUser(alice);
chatRoom.addUser(bob);

alice->send("Hello Bob!");
bob->send("Hello Alice!");

delete alice;
delete bob;
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值