zoukankan      html  css  js  c++  java
  • 设计模式(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();
    }
    

      

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

     

  • 相关阅读:
    关于feign调用请求头丢失分析
    并发下编写SQL的注意事项
    Sentinel降级规则整理
    Mybatis-Plus使用整理
    Docker各种零散命令整理
    set集合怎么保证不重复的
    idea启动项目ava heap space
    网络穿透工具--钉钉HTTP穿透
    Log4j基本使用
    ide中普通java程序打包
  • 原文地址:https://www.cnblogs.com/sylar-liang/p/6024713.html
Copyright © 2011-2022 走看看