一般而言,我们把委托模式也会称为代理模式,如果文字游戏玩的不好,建议还是叫委托模式。但是这要和语法层面的委托区分开,委托机制作为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 !
以上代码,可以清晰的看到委托的全流程,我们将真实的实际类(买家类)通过委托的方式,让中介执行具体的任务(中介买房的流程),实现了逻辑与代码的分离,今后只需要修改具体的中介类就可以修改买房的行为,而不用调用者修改代码。而且,没有使用继承的方式,毕竟设计模式中,多使用组合 优于使用继承。