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

1、在面向对象系统设计和开发的过程中,对象之间的交互和通信是最为常见的情况,系统比较小的时候,可能对象间的通信不是很多,对象也比较少,我们可以直接硬编码到各个对象的方法中,但是当系统规模变大,对象的种类数量增多,对象量变引起系统复杂度急剧增加,对象间的通信也变得复杂,这时我们需要提供一个专门处理对象间交互和通信的类。这就是中介者模式。用一个中介对象来封装对象一系列的交互和通信,使各个对象不需要显式的互相引用,从而使其耦合松散,而且可以独立的改变它们之间的交互,大大降低了系统的复杂性,中介者模式的例子有很多,大到联合国安理会,小到房屋中介,都扮演了中介者的角色,协调各方利益。

2、我们以租房子为例,如果没有房屋中介,那么房客要自己找房东,而房东也要自己找访客,非常的不方便,有了房屋中介机构,房东可以把要出租的房屋信息放到中介机构,而房客可以去中介机构咨询。在软件中,就是多个对象之间需要通信,如果没有中介,对象就需要知道其他对象,最坏情况下可能需要知道所有其他对象,而有了中介对象就方便多了,对象只需与中介对象通信,而不用知道其他对象。

#include<iostream>
#include<string>
#include<list>
using namespace std;

class Mediator;
//抽象人
class Person
{
    
    
public:
	string m_name;
protected:
	Mediator *m_mediator; //中介
public:
	virtual void SetMediator(Mediator* mediator){
    
    } //设置中介
	virtual void SendMessage(string message){
    
    } //向中介发送信息(然后中介帮我发出去)
	virtual void GetMessage(string message){
    
    } //从中介中获取信息(中介告诉我别人发来的消息)
};

//抽象中介机构
class Mediator{
    
    
protected:
	list<Person*>  m_listrenter;   //租房者集合
	list<Person*>  m_listlandlord; //房东集合
public:
	void push_renter(Person* A)
	{
    
    
		m_listrenter.push_back(A);
	}
	void push_landlord(Person* B)
	{
    
    
		m_listlandlord.push_back(B);
	}
	virtual void Send(string message, Person *person){
    
    };
	virtual void SetRenter(Person* A){
    
    }  //中介机构需要知道来的是租客还是房东
	virtual void SetLandlord(Person* B){
    
    }
};
//租房者
class Renter:public Person
{
    
    
public:
	Renter(string name)
	{
    
    
		m_name = name;
	}
public:
	void SetMediator(Mediator* mediator)
	{
    
    
		m_mediator = mediator;
	}
	void SendMessage(string message) //send给landlord 通过中介者 不仅要传给中介者所发的消息,还要告诉他我是租客还是房东
	{
    
    
		m_mediator->Send(message,this);
	}
	void GetMessage(string message)
	{
    
    
		cout<<m_name<<"租房者收到信息:"<<message<<endl;
	}
};

//房东
class Landlord:public Person
{
    
    
public:
	Landlord(string name)
	{
    
    
		m_name = name;
	}
public:
	void SetMediator(Mediator* mediator)
	{
    
    
		m_mediator = mediator;
	}
	void SendMessage(string message)  //send给renter 通过中介者 不仅要传给中介者消息,还要告诉他我是房东还是租房者
	{
    
    
		m_mediator->Send(message,this);
	}
	void GetMessage(string message)
	{
    
    
		cout<<m_name<<"房东收到信息:"<<message<<endl;
	}
};

//房屋中介
class HouseMediator : public Mediator
{
    
    
private:
	Person *m_renter; //租房者
	Person *m_landlord; //房东
public:
	HouseMediator(): m_renter(0), m_landlord(0) {
    
    }
	void SetRenter(Person *A)  //设置现在想要发消息的是租房者还是房东
	{
    
    
		m_renter = A; 
	}
	void SetLandlord(Person *B) 
	{
    
     
		m_landlord = B; 
	}
	void Send(string message, Person *person) 
	{
    
    
		if(person == m_renter){
    
    
			list<Person*> ::iterator ite = m_listlandlord.begin();
			while(ite != m_listlandlord.end())
			{
    
    
				(*ite)->GetMessage(message);
				ite++;
			}	
		}
		else
		{
    
    
			list<Person*> ::iterator ite = m_listrenter.begin();
			while(ite != m_listrenter.end())
			{
    
    
				(*ite)->GetMessage(message);
				ite++;
			}
		}
	}

};
int main()
{
    
    
	Mediator* mediator = new HouseMediator();

	Person* renter1 = new Renter("租客1");
	Person* renter2 = new Renter("租客2");
	Person* landlord1 = new Landlord("房东1");

	mediator->push_renter(renter1);
	mediator->push_renter(renter2);
	mediator->push_landlord(landlord1);


	renter1->SetMediator(mediator);  //相当于租客或者房东和这家中介机构绑定了
	renter2->SetMediator(mediator);
	landlord1->SetMediator(mediator);

	mediator->SetRenter(renter1);//告诉中介我是房东还是租客
	renter1->SendMessage("我想要租一个学区房,联系方式111111");  //租客发消息 走到函数里(去函数里看一眼!) 就是租客上面绑定的中介替他把消息发送到房东手中

	mediator->SetRenter(renter2);
	renter2->SendMessage("我想要租一个带阳台的房子,联系方式222222");

	mediator->SetLandlord(landlord1);
	landlord1->SendMessage("出租学区房,联系方式333333");

	delete renter1; delete renter2;delete landlord1;delete mediator;

	return 0;
}

在这里插入图片描述
细心的朋友应该发现了上面的代码里面还有观察者模式的影子,每个租房者和房东既是观察者,也是被观察者,当一个人来到了中介机构,他需要和中介表明自己的身份,比如他是房东(被观察者),那么中介就会帮他把他想要出租的房子的信息发送到每一个租房者(观察者)手里。租房者来到中介也是如此。

3、中介者模式是一种很有用并且很常用的模式,它通过将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性。中介者模式还有一个很显著的特点就是将控制集中,集中的优点就是便于管理,也正式符合了 OO 设计中的每个类的职责要单一和集中的原则。(PS:OO设计原则,即面向对象的设计原则,OO(Object Oriented,面向对象) )

部分内容参考于:https://blog.csdn.net/wuzhekai1985/article/details/6673603

Guess you like

Origin blog.csdn.net/scarificed/article/details/121385451