c++设计模式之代理模式和中介模式 学习笔记

标题把代理模式和中介模式写在一起,是因为二者具有一定的相似性。
首先,什么是代理?现实中我们所说的代理一般都是指某一家厂商的代理,比如你买A公司的产品,你就可以找他们的代理M。在这里我们所指的M代理是对A公司来说的,M的职责是帮助A公司完成销售的任务~~当然,代理不仅限于此,但通过这个我们可以窥探一下代理模式的功能——帮助某一特定对象将某些职责/功能封装起来,以代理类的形式向外提供。具体实现的话,就是在代理类中关联厂商类,并向外提供需要的职责函数,该函数是以关联的厂商类来实现的。

那什么是中介?我们去租房/买房,很多情况是直接找房产中介,或者你想要卖房/出租房,也可以去找房产中介。对于房东或者租客而言,中介是二者之间的纽带。中介连接了多个对象之间的相互联系。具体实现的话,中介类里面关联租房/房东类,租房/房东类里面也关联中介类,租房/房东类实现的租房或出租的功能函数,是通过调用中介类的函数来传递信息,中介类的该函数也会判断传递过来的房东/租房类信息,并对该信息需要的房东/租房类发出通知。

下面以买房为例来介绍一下代理/中介模式。
先给出代理模式的:

#include<iostream>

class BuyHouse
{
public:
	virtual void buyHouse(int money) = 0;
};

class YourSelf:public BuyHouse //我是实际购房者
{
public:
	void buyHouse(int money)
	{
		std::cout << "我花"<< money<<"万来买符合我要求的房子" << std::endl;
	}
};
class Proxy:public BuyHouse  //精通房价并帮助购房的人
{
public:
	Proxy(YourSelf *wanter) :buyer(wanter)
	{

	}
	int getHouseMoney()
	{
		std::cout << "中介查了本市较好地段的学区房,并从价格,小区物业,房子质量等因素综合考虑,和售房处以288万的价格敲定了符合要求的房子" << std::endl;
		return 300;
	}
	void buyHouse(int money)
	{
		
		buyer->buyHouse(300);
	}
private:
	YourSelf * buyer;
};
void main()
{
	YourSelf *buyHousePeople=new YourSelf;//我是一个购房者
	Proxy *intermediary = new Proxy(buyHousePeople);//我联系了一个中介帮我买房
	intermediary->buyHouse(intermediary->getHouseMoney()); //我通过中介,付钱买了房子
	delete buyHousePeople;
	delete intermediary;
	system("pause");
	return;

}

上述实例堪堪可以视为代理模式,(其实并不恰当,因为这个例子其实适合作为中介模式的实例),在这里,不考虑代理(房产中介)可能面向的多个卖家或者买家,只是以你这个单独的买房者的角度看——你有一个需求(无论是买还是卖),交给了你找的代理,他通过关联你的方法来对外提供了这个需求,这就是代理模式。
然后给出中介模式的:

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




class Mediator;
//需求者
class Needer
{
public:
	Needer(Mediator *mediator):m_mediator(mediator)
	{

	}
	virtual void noticeMediator(string message)  //客户找中介,告知需求
	{

	}
	virtual void mediatorNotice(string message)  //中介实现需求,通知客户
	{

	}
protected:
	Mediator *m_mediator;
};

//中介记录需求的本本
class Record
{
public:
	Record(Needer *needer, string need) :m_needer(needer), m_need(need) {}
	Needer *m_needer;
	string m_need;
};
//中介
class Mediator
{
public:
	virtual void saveRenter(Needer *needer, string message)
	{

	}
	virtual void saveLessor(Needer *needer, string message)
	{

	}
	virtual Record * findJustNeeder(string message)
	{
		return NULL;
	}
	virtual void noticeNeeder(Needer *needer, string message)
	{

	}
protected:
	vector <Record *> renterRecord;
	vector <Record *> LessorRecord;
};

//租房者
class Renter:public Needer  
{
public:
	Renter(Mediator *mediator) :Needer(mediator)
	{

	}
	void noticeMediator(string message)
	{
		m_mediator->saveRenter(this, message);  
		m_mediator->noticeNeeder(this, message);
	}
	void mediatorNotice(string message) 
	{
		cout << "短信发给我的需求消息:" << message << endl;
	}

};
//出租者
class Lessor :public Needer
{
public:
	Lessor(Mediator *mediator) :Needer(mediator)
	{

	}
	void noticeMediator(string message)
	{
		m_mediator->saveLessor(this, message);
		m_mediator->noticeNeeder(this, message);
	}
	void mediatorNotice(string message)
	{
		cout << "短信发给我的需求消息:" << message << endl;
	}

};



//房产中介
class HouseMediator :public Mediator
{

	void saveRenter(Needer *needer, string message)
	{
		Record *new_record = new Record(needer, message);
		renterRecord.push_back(new_record);
	}
	void saveLessor(Needer *needer, string message)
	{
		Record *new_record = new Record(needer, message);
		LessorRecord.push_back(new_record);
	}
	Record * findJustNeeder(string message)
	{
		cout << "根据需求,从我的小本本上查找合适的租房者或者出租者,返回合适的需求者,如果没有返回个空" << endl;
		return NULL; //注意,这里简写了
		
	}
	void noticeNeeder(Needer *needer, string message)
	{
		Record *needRecord;
		needRecord =findJustNeeder(message);
		if (needRecord == NULL)
		{
			needer->mediatorNotice("暂时没有合适的");
		}
		else
		{
			needer->mediatorNotice(needRecord->m_need);
		}
	}

};

void main()
{
	Mediator *mediator = new HouseMediator();  //我是一个房产中介
	Needer * renterNeed = new Renter(mediator); //今天有一个租房者找到了我
	renterNeed->noticeMediator("我想要租A小区的租金为2000元一个月的性价比高的房子"); //他告诉我需要,我先把他记在了我的小本本上,然后帮他查了一下,发现暂时还没有,但以后如果有我会主动通知他
   //**别忘了析构,比较懒,没有写析构函数,这里需要delete一下**

	system("pause");
}

在这里插入图片描述
上述代码就是中介模式的例子。其实到了这里就可以理清楚中介模式和代理模式了,没有刚开始学的时候那种傻傻分不清楚的感觉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值