C++ 大话设计之《中介者模式》(优缺点,设计原理,常用场景)

中介者模式是一种行为型设计模式,用于简化对象间的交互,减少对象的耦合。它通过一个中介对象协调各个同事类,遵循迪米特法则,降低了系统的复杂性。在MVC框架中,控制器作为模型和视图的中介者。代码示例展示了如何使用中介者模式进行通信。
摘要由CSDN通过智能技术生成

中介者模式是一种行为型模式


 

优点:

  • 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,让原本两两调用的对象解耦。
  • 减少了子类生成。
  • 简化各个同事类的设计和实现。

缺点:

如果在业务场景中中介者数量过多,会导致系统复杂性增加。
总之,中介者模式在一定程度上可以简化系统的设计,但是也可能会增加系统的复杂性。

与代理模式的对比:

中介者模式是多对多通信,而代理模式是一对一通信。

满足设计原则:

  • 中介者模式是迪米特法则的典型应用。迪米特法则又叫最少知识原则,它要求一个对象应该对其他对象保持最少的了解1。
  • 中介者模式通过定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互2。
  • 总之,中介者模式满足了迪米特法则,通过引入中介者对象来减少对象之间的直接交互,降低了系统的耦合度。

常用实例:

例如,在现实生活中,人们可以通过房屋中介来租房,也可以通过人才交流中心来找工作1。
在软件开发中,MVC框架中的控制器(C)就是模型(M)和视图(V)的中介者1。
另一个常见的例子是聊天室。在聊天室中,多人可以在聊天室中聊天,聊天室实例只有一个,用户可以创建多个,并持有聊天室引用2。
 

类图:

代码: 

#include "iostream"
#include "string"
#include "vector"

using namespace std;



class Mediator
{
public:
	virtual void send(const string&message,class Colleague*solleague)=0;

};
class Colleague
{
public:
	Colleague(Mediator*mediator):mediator(mediator){};
	virtual void send(const string &message)=0;
	virtual void receive(const string &message)=0;
	


protected:
	Mediator *mediator;
};

class ConcreteColleaguel :public Colleague {
public: 
	ConcreteColleaguel(Mediator*mediator):Colleague(mediator){};
	void send(const string& message) {
		mediator->send(message,this);
	}

	void receive(const string& message)
	{
		cout<<"Colleaguel received"<<message<<endl;
	}

};

class ConcreteColleague2 :public Colleague {
public:
	ConcreteColleague2(Mediator*mediator):Colleague(mediator){}
	void send(const string& message)
	{
		mediator->send(message,this);
	}

	void receive(const string& message)
	{
		cout<<"Colleague2 received:"<<message<<endl;
	}

};



class ConcreteMediator :public Mediator {
private:
	ConcreteColleaguel*colleague1;
	ConcreteColleague2*colleague2;

public:
	void setCollleaguel(ConcreteColleaguel* colleague)
	{
		colleague1=colleague;
	}

	void setCollleague2(ConcreteColleague2* colleague)
	{
		colleague2 = colleague;
	}

	void send(const string& message, Colleague* colleague)
	{
		if (colleague == colleague1)
		{
			colleague2->receive(message);
		}
		else
		{
			colleague1->receive(message);
		}

	}
	
};


int main()
{
	ConcreteMediator mediator;

	ConcreteColleaguel c1(&mediator);
	ConcreteColleague2 c2(&mediator);

	mediator.setCollleaguel(&c1);
	mediator.setCollleague2(&c2);

	c1.send("dddddd");
	c2.send("dddddddddcvccc");




	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值