zoukankan      html  css  js  c++  java
  • 委托你个模式

    一般而言,我们把委托模式也会称为代理模式,如果文字游戏玩的不好,建议还是叫委托模式。但是这要和语法层面的委托区分开,委托机制作为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 !
    

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

  • 相关阅读:
    jmeter_分布式测试
    Locust性能测试_百度案例
    tkinter学习笔记_06
    tkinter学习笔记_05
    web前后端交互,nodejs
    Chrome Vue Devtools插件安装和使用
    line-height和height的区别
    网站头部导航
    屏蔽元素默认样式中的边距
    CSS Float(浮动)
  • 原文地址:https://www.cnblogs.com/Stultz-Lee/p/10007655.html
Copyright © 2011-2022 走看看