• 设计模式(4)--代理模式


    //4.代理模式
    //ver1
    //被追求者类
    class SchoolGirl
    {
    private:
    	string _name;
    public:
    	SchoolGirl(){}
    	SchoolGirl(string name)
    	{
    		_name = name;
    	}
    	string GetName()
    	{
    		return _name;
    	}
    	void SetName(string name)
    	{
    		_name = name;
    	}
    };
    
    //接口函数类
    class GiveGift
    {
    public:
    	GiveGift(){}
    
    	//Interface
    	virtual void GiveToy()
    	{
    		//...
    	}
    	virtual void GiveFlower()
    	{
    		//...
    	}
    };
    
    //追求者类
    class Pursuit : public GiveGift
    {
    private:
    	SchoolGirl _mm;
    public:
    	Pursuit(SchoolGirl mm)
    	{
    		_mm = mm;
    	}
    
    	void GiveToy()
    	{
    		_mm.GetName(); // + 送你玩具
    	}
    	void GiveFlower()
    	{
    		_mm.GetName(); // + 送你花
    	}
    };
    
    //代理类 //代理也去实现 "送礼物" 的接口
    class Proxy : public GiveGift
    {
    private:
    	Pursuit *pps;
    
    public:
    	Proxy(SchoolGirl mm)
    	{
    		pps = new Pursuit(mm);
    	}
    	void GiveFlower()
    	{
    		pps->GiveFlower(); //在实现方法中去调用"追求者"类的相关方法;
    	}
    	void GiveToy()
    	{
    		pps->GiveToy();
    	}
    };
    
    void main1()
    {
    	SchoolGirl mm("ysl");
    	Proxy *pp1 = new Proxy(mm);
    	pp1->GiveFlower(); //SchoolGirl不认识Pursuit,但可以通过Proxy得到礼物。
    	pp1->GiveToy();
    }
    
    //代理模式: 为其他对象提供一种代理以控制对这个对象的访问.
    
    //4.代理模式
    //ver2
    //Subject: 定义了 RealSubject 和 Proxy 的共用接口。这样在任何使用 RealSubject的地方都可以使用Proxy
    class Subject
    {
    public:
    	virtual void Request() = 0;
    };
    //RealSubject: 定义Proxy所代表的真实实体。
    class RealSubject : public Subject
    {
    public:
    	virtual void Request()
    	{
    		//真实请求
    	}
    };
    
    //Proxy: 保存一个引用使得代理可以访问实体。
    class Proxy : public Subject
    {
    private:
    	RealSubject *rs;
    public:
    	virtual void Request()
    	{
    		if (rs == NULL)
    		{
    			rs = new RealSubject();
    		}
    		rs->Request();
    	}
    };
    
    void main2()
    {
    	Proxy *pp1 = new Proxy();
    	pp1->Request();
    }
    

      

    //代理模式场合:
    //一.远程代理。也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
    //二.虚拟代理。是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
    //三.安全代理。用来控制真实对象访问时的权限。
    //四.智能指引。当调用真实的对象时,代理处理另外一些事。

     

  • 相关阅读:
    HDU1251 字典树 这题亮点在于是我自己写的字典树
    POJ3253 哈夫曼树+小根堆 【自己实现】
    poj3083 深搜
    用c语言的感觉
    poj1321 深搜
    POJ 2488 深搜
    HDU2037 今年暑假不AC 贪心
    hdu1247 Hat’s Words 字符串模拟
    Thrift框架具体使用
    如何使用Rose将类图转化为java代码
  • 原文地址:https://www.cnblogs.com/sylar-liang/p/6024713.html
Copyright © 2020-2023  润新知