1. 远程代理

/*
* 第一种代理模式:远程代理

*(情景:小明喜欢小红,但是害羞不好意思表白。小明通过中间代理人小丽,把礼物送给小红,表达自己对小红的爱意)
*/

Subject抽象主题角色

//实现一个抽象的女孩类
class Girl
{
public:Girl(char* name = "") :m_name(name){}char* getName(){return m_name;}private:char* m_name;
};//实现一个送礼物的接口类
class GiveGift
{
public:virtual void GiveDolls() = 0;virtual void GiveFlowers() = 0;virtual void GiveChocolate() = 0;
};

RealSubject指针主体角色

//送礼物的实例类,比如追求者小明
class Puisuit : public GiveGift
{
public:Puisuit(char* name, Girl loveGirl) :m_SelfName(name), m_LoveGirl(loveGirl){}char* getSelfName(){return m_SelfName;}char* getLoveGirlName(){return m_LoveGirl.getName();}virtual void GiveDolls(){std::cout << "送" << m_LoveGirl.getName() << "玩具!" << std::endl;}virtual void GiveFlowers(){std::cout << "送" << m_LoveGirl.getName() << "鲜花!" << std::endl;}virtual void GiveChocolate(){std::cout << "送" << m_LoveGirl.getName() << "巧克力!" << std::endl;}
private:Girl m_LoveGirl;//被追求对象:小红char* m_SelfName;
};

Proxy代理主题角色

//送礼物的代理类,比如中间人小丽
class Proxy : public GiveGift
{
public:Proxy(char* name, Girl girl){m_Puisuit = new Puisuit(name,girl);}~Proxy(){if (nullptr != m_Puisuit){delete m_Puisuit;m_Puisuit = nullptr;}}virtual void GiveDolls(){std::cout << m_Puisuit->getLoveGirlName() << ",这是" << m_Puisuit->getSelfName() << "送你的礼物!" << std::endl;m_Puisuit->GiveDolls();}virtual void GiveFlowers(){std::cout << m_Puisuit->getLoveGirlName() << ",这是" << m_Puisuit->getSelfName() << "送你的礼物!" << std::endl;m_Puisuit->GiveFlowers();}virtual void GiveChocolate(){std::cout << m_Puisuit->getLoveGirlName() << ",这是" << m_Puisuit->getSelfName() << "送你的礼物!" << std::endl;m_Puisuit->GiveChocolate();}
private:Puisuit* m_Puisuit;//追求对象:小明
};

主函数

int main()
{std::cout << "***************远程代理***************" << std::endl;Girl loveGirl("小红");//中间人小丽Proxy pro("小明", loveGirl);//小丽代表小明给小丽送玩具pro.GiveDolls();std::cout << std::endl;//小丽代表小明给小丽送鲜花pro.GiveFlowers();std::cout << std::endl;//小丽代表小明给小丽送巧克力std::cout << std::endl;pro.GiveChocolate();system("pause");return 0;
}

2. 虚拟代理

/*
* 第二种代理模式:虚拟代理(根据需要创建开销最大的对象,通过它来存放实例化需要很长时间的对象)
*/

//抽象主题角色
class Image
{
public:Image(std::string name) : m_imageName(name){}virtual ~Image(){}virtual void Show(){}protected:string m_imageName;
};//真实主题角色
class BigImage : public Image
{
public:BigImage(std::string name) : Image(name){}~BigImage() {}void Show(){}private:
};//代理主题角色
class BigImageProxy : public Image
{
public:BigImageProxy(std::string name) : Image(name), m_pBigImage(nullptr){}~BigImageProxy(){if (nullptr != m_pBigImage){delete m_pBigImage;m_pBigImage = nullptr;}}void Show(){if (nullptr == m_pBigImage){m_pBigImage = new BigImage(m_imageName);}m_pBigImage->Show();}private:BigImage* m_pBigImage;
};//主函数
int main()
{std::cout << "***************虚拟代理***************" << std::endl;Image *image = new BigImageProxy("proxy.jpg"); //代理  image->Show(); //需要时由代理负责打开  delete image;std::cout << std::endl;system("pause");return 0;
}

3. 安全代理

/*
* 第三种代理模式:安全代理(游戏中,通过代理来控制不同vip玩家的游戏权限)
*/

//抽象类
class Play
{
public:virtual void Play1() = 0;virtual void Play2() = 0;virtual void Play3() = 0;private:};//操作类
class Player : public Play
{
public:void Play1(){std::cout << "Play1:战役" << std::endl;}void Play2(){std::cout << "Play2:军团" << std::endl;} void Play3(){std::cout << "Play3:神器" << std::endl;}
private:};//不用玩家的代理
class ProxyPlayerVIP1 : public Play
{
public:ProxyPlayerVIP1(){m_pPlayer = new Player;}void Play1(){m_pPlayer->Play1();}void Play2(){std::cout << "Play2:没有权限!" << std::endl;}void Play3(){std::cout << "Play3:没有权限!" << std::endl;}private:Play* m_pPlayer;
};class ProxyPlayerVIP2 : public Play
{
public:ProxyPlayerVIP2(){m_pPlayer = new Player;}void Play1(){std::cout << "Play1:没有权限!" << std::endl;}void Play2(){m_pPlayer->Play2();}void Play3(){std::cout << "Play3:没有权限!" << std::endl;}private:Play* m_pPlayer;
};class ProxyPlayerVIP3 : public Play
{
public:ProxyPlayerVIP3(){m_pPlayer = new Player;}void Play1(){std::cout << "Play1:没有权限!" << std::endl;}void Play2(){std::cout << "Play2:没有权限!" << std::endl;}void Play3(){m_pPlayer->Play3();}private:Play* m_pPlayer;
};//主函数
int main()
{std::cout << "***************安全代理***************" << std::endl;ProxyPlayerVIP1 pro1;pro1.Play1();pro1.Play2();pro1.Play3();std::cout << std::endl;ProxyPlayerVIP2 pro2;pro2.Play1();pro2.Play2();pro2.Play3();std::cout << std::endl;ProxyPlayerVIP3 pro3;pro3.Play1();pro3.Play2();pro3.Play3();system("pause");return 0;
}

4. 智能引用代理

设计模式之Proxy代理模式相关推荐

  1. 设计模式之蝉——代理模式上中

    代理模式的扩展 1 普通代理 :这种代理就是客户端只能访问代理角色,而不能访问真实角色.与设计模式之蝉--代理模式上 片基本差不多. (1)Subject抽象主题角色: (2)RealSubject具 ...

  2. 设计模式学习之代理模式学习(一)

    设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...

  3. 设计模式之静态代理模式实战

    转载自 设计模式之静态代理模式实战 静态代理模式很简单,代理类和实现类都实现相同的接口,然后通过代理类来调用实现类的方法. 如我们想保存用户信息之前打印用户信息,或者保存用户信息之后把这些信息缓存下来 ...

  4. 每日一个设计模式之【代理模式】

    文章目录 每日一个设计模式之[代理模式] ☁️前言

  5. Java24种设计模式(第二种)--代理模式(Proxy Pattern)

    Java24种设计模式 (第二种) 一.代理模式(Proxy Pattern) 模式逻辑: 什么是代理模式呢?我很忙,忙的没空理你,那你要找我呢就先找我的代理人吧,那代理人总要知道 被代理人能做哪些事 ...

  6. 设计模式之略见一斑(代理模式Proxy)

    普通对象所需要完成的任务就是通过公共接口为外界提供自己所承诺的服务.然而,有时候合法的对象可能会因为各种原因而无法完成自己常规的任务.尤其是当对象需要长时候才能载入内存.对象正运行在另一台计算机上或者 ...

  7. Java设计模式-Proxy代理模式

    问题分析: 什么是代理模式呢?其实我们在生活中并不少见.对于程序员来说最常接触的莫过于代理上网了,连接大力服务器地址,就可以访问网络. 还有每天吃饭赶进度是常事,叫公司的同事帮忙带饭也是一种代理:如果 ...

  8. Net设计模式实例之代理模式(Proxy Pattern)

    一.代理模式简介(Brief Introduction) 代理模式(Proxy Pattern)对其他对象提供一种代理以控制对这个对象的访问. 二.解决的问题(What To Solve) 1.远程代 ...

  9. [C++设计模式] proxy 代理模式

    代理模式:为其它对象提供一种代理以控制对这个对象的訪问. Proxy: 保存一个引用使得代理能够訪问实体.若RealSubject和Subject的接口同样,Proxy会引用Subject,就相当于在 ...

最新文章

  1. python中plot的plt.text_用Python进行数据可视化的第一步,全面详解matplotlib中样式属性...
  2. react router 路由守卫_react实现hash路由
  3. boost::hana::just用法的测试程序
  4. android 拦截webview资源请求,Android Webview拦截ajax请求
  5. 数据库的缓存管理[ASPNET2.0深入挖掘系列听后感]
  6. 搜索长度未知的有序数组java_java二分法实现在有序的数组中定位某数在数组中的位置...
  7. asp.net 应用数据缓存 -- Cache对象使用
  8. eclipse java类图_eclipse中。green UML 自动生成类图
  9. 一加10 Pro的性能配置还是非常不错的
  10. win10电脑桌面透明便签_Windows xp电脑便签在哪里找?XP系统怎么建桌面便签
  11. Leader:这样的 Bug 你也写的出来???
  12. 能在沙漠飞行的翱翔机
  13. 【PPT已更新】给开发者的区块链技术指南 | JTalk 掘金线下活动第五期
  14. 短视频无水印解析网站源码
  15. 计算机网络基础试题库4答案,计算机网络基础试题库4.doc
  16. 财智V6.0(完美破解序列号特别版)
  17. 计算机组装所需要的主要配件有哪些,组装电脑需要哪些零件_组装电脑需要哪些配件...
  18. excel多级联动和不规则分组转置
  19. html语言间距怎么设置,HTML文字的间距怎么设置
  20. java是怎么分配内存和释放内存的-详解

热门文章

  1. HTTP 与 HTTPS 的不同之处
  2. ZZULIOJ1023
  3. Zynq裸跑头文件问题
  4. Deepin设置隐藏Windows分区
  5. linux下dns配置方法与常用dns
  6. Python退出程序 sys.exit()
  7. android吉凶信息查询代码,手机号码吉凶查询工具 公开源码,可任意修改
  8. 搭建一个最简单的首页随机图片api
  9. C#中的接口(interface)
  10. 申请海外MBA如何写英文自荐信和推荐信