委托你个模式

一般而言,我们把委托模式也会称为代理模式,如果文字游戏玩的不好,建议还是叫委托模式。但是这要和语法层面的委托区分开,委托机制作为C#语法的一部分,在C++中是没有的。但就设计模式而言,委托模式却可以使用bind来标新立异的。

在设计模式中,委托模式,从本质上讲,就是通过一个Proxy这样的东西,将你所要处理的东西,或者请求转发给某个函数或者对象。 从而达到委托(代理)的目的。

举个栗子,买二手房的时候,很多人选择找中介,虽然中介有时候也黑,但是为了买的省心点,买家还是愿意使用中介的,中介是有其价值的,比如帮买家选择房源,带看房,跑房产局等;

于是 就有了委托一说, 买方 ---->委托中介----->达成买房的目标;

一般的代理模式,需要使用继承

具体的可以自行百度

使用bind来优化下吧

Show me The Code

#include <iostream>
#include <memory>

#include <functional>

namespace delegatePattern
{

typedef std::tr1::function<void (const std::string&)>  Functor1;	
//房屋类,
class House
{
public:
	House(const std::string& addr):address_(addr){

	}
	~House(){}
	std::string showAddr(){
		return address_;
	}
private:
	std::string address_;
};

typedef std::tr1::shared_ptr<delegatePattern::House> SpHouse;
//中介
class Agency
{
public:
	Agency(SpHouse sphouse):sphouse_(sphouse),agreement_(NULL){};
	~Agency(){};
	//和中介签署的回调协议
	void makeDelegateAgreement(const Functor1& agreement){
		agreement_ = agreement;
	}
	//中介买房子后通知卖家
	void buyHouseForBuyer(const std::string& name) const{
		std::cout << "I am Agency,Buy a house in "<< sphouse_->showAddr().c_str()<< " for " <<name.c_str()<<std::endl;
		if(agreement_) agreement_(name);
	}
private:
	Functor1 agreement_;
	SpHouse sphouse_;
}; 

typedef std::tr1::shared_ptr<delegatePattern::Agency> SpAgency;
//买家类
class Buyer
{
public:
	Buyer(std::string name):name_(name){}
	~Buyer(){}
	//委托给中介
	void delegateAgency(std::tr1::shared_ptr<Agency> agy){
		agency_ = agy;
	}
	//买家买房子的行为,其实是由中介完成的
	void buyHouse(){
		agency_->makeDelegateAgreement(std::tr1::bind(&Buyer::onBuyDone,this,name_));
		agency_->buyHouseForBuyer(name_);
	}

private:
	std::string name_;	
	std::tr1::shared_ptr<Agency> agency_;
	
	void onBuyDone(const std::string& name){
		std::cout << "wow ,I "<<name.c_str()<<" bought a House !" <<std::endl;
	}	
};


}

测试代码

//房源
delegatePattern::SpHouse houseMe(new delegatePattern::House("China.Wuhan.EDT"));
//中介拥有该房源
delegatePattern::SpAgency agency(new delegatePattern::Agency(houseMe));
//买家lcksfa
delegatePattern::Buyer lcksfa("lcksfa");
//买家委托中介买房子
lcksfa.delegateAgency(agency);
lcksfa.buyHouse();

结果如下:

I am Agency,Buy a house in China.Wuhan.EDT for lcksfa
wow ,I lcksfa bought a House !

以上代码,可以清晰的看到委托的全流程,我们将真实的实际类(买家类)通过委托的方式,让中介执行具体的任务(中介买房的流程),实现了逻辑与代码的分离,今后只需要修改具体的中介类就可以修改买房的行为,而不用调用者修改代码。而且,没有使用继承的方式,毕竟设计模式中,多使用组合 优于使用继承。

posted @ 2018-11-23 15:00  Lckfa  阅读(143)  评论(0编辑  收藏  举报