一,概述

定义:代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。

作用:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端 和目标对象之间起到中介的作用。

思想:为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。

远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。

虚拟(Virtual)代理(图片延迟加载的例子):根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。

Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。

二,示例

描述:卓贾易让戴励送给李娇娇礼物,追求李娇娇。

1)小菜第一版代码

缺点:卓贾易直接行使送礼物类,不符合题目意思。

#include <iostream>
#include <String>using namespace std;class SchoolGirl //要追的女孩
{
public:void SetName(string str)//名字 {m_Name = str;};string GetName(void) //获取女孩名字 {return m_Name;};
private:string m_Name;
};class Pursuit//追求行为类
{
public:Pursuit(SchoolGirl* mm){m_mm = mm;};void GiveDolls(){cout << m_mm->GetName() << "送你洋娃娃" << std::endl;};void GiveFlower(){cout << m_mm->GetName() << "送你鲜花" << std::endl;};void GiveChocolate(){cout << m_mm->GetName() << "送你巧克力" << std::endl;};
private:SchoolGirl* m_mm;
};int main()
{SchoolGirl* jiaojiao = new SchoolGirl();//初始化要追求的对象 jiaojiao->SetName("李娇娇");//事实上娇娇并不认识卓贾易Pursuit* zhuojiayi = new Pursuit(jiaojiao);zhuojiayi->GiveChocolate();zhuojiayi->GiveDolls();zhuojiayi->GiveFlower();delete jiaojiao;delete zhuojiayi;return 0;
}

2)小菜代理第二版

缺点:也不是让戴励自己亲自追求,不符合题意。

#include <iostream>
#include <String>using namespace std;class SchoolGirl //要追的女孩
{
public:void SetName(string str)//名字 {m_Name = str;};string GetName(void) //获取女孩名字 {return m_Name;};
private:string m_Name;
};class Proxy//代理类,其实是戴励
{
public:Proxy(SchoolGirl* mm){m_mm = mm;};void GiveDolls(){cout << m_mm->GetName() << "送你洋娃娃" << endl;};void GiveFlower(){cout << m_mm->GetName() << "送你鲜花" << endl;};void GiveChocolate(){cout << m_mm->GetName() << "送你巧克力" << endl;};
private:SchoolGirl* m_mm;
};int main()
{SchoolGirl* jiaojiao = new SchoolGirl();jiaojiao->SetName("李娇娇");Proxy* daili = new Proxy(jiaojiao);daili->GiveChocolate();daili->GiveDolls();daili->GiveFlower();return 0;
}

3)小菜第三版

改进:添加接口,让一个对象实现接口,代理负责运用接口。

实现:代理同样实现接口,只是代理实现接口的时候实际上是调用实际实现者的方法。

#include <iostream>
#include <String>using namespace std;class SchoolGirl //要追的女孩
{
public:void SetName(string str)//名字 {m_Name = str;}string GetName(void) //获取女孩名字 {return m_Name;}
private:string m_Name;
};class IGiveGift//送礼物接口(抽象函数就是接口)
{virtual void GiveDolls(void)=0;virtual void GiveFlower(void)=0;virtual void GiveChocolate(void)=0;
};class Pursuit:public IGiveGift//追求者类
{
public:Pursuit(SchoolGirl *mm){m_mm = mm;}void GiveDolls(){cout << m_mm->GetName() << "送你洋娃娃" <<endl;}  void GiveFlower(){cout << m_mm->GetName() << "送你鲜花" <<endl;}void GiveChocolate(){cout << m_mm->GetName() << "送你巧克力" <<endl;}
private:SchoolGirl *m_mm;
};class Proxy:public IGiveGift//代理类,其实是戴励
{
public:Proxy(SchoolGirl* mm){m_gg = new Pursuit(mm);}~Proxy(){if(m_gg!=NULL){delete m_gg;m_gg=NULL;}}void GiveDolls(){m_gg->GiveDolls();}void GiveFlower(){m_gg->GiveFlower();}void GiveChocolate(){m_gg->GiveChocolate();}
private:Pursuit* m_gg;
};int main()
{SchoolGirl* jiaojiao = new SchoolGirl();jiaojiao->SetName("李娇娇");Proxy* daili = new Proxy(jiaojiao);daili->GiveChocolate();daili->GiveDolls();daili->GiveFlower();return 0;
}

三,代理模式的经典模板

#include <iostream>
#include <String>using namespace std;class Subject
{
public:virtual void Request(void) = 0;
};class RealSubject : public Subject
{
public:void Request(void){cout << "真实的请求" << endl;};
};class Proxy : public Subject
{
public:Proxy():m_realSubject(NULL){}void Request(void){if (m_realSubject == NULL){m_realSubject = new RealSubject();}m_realSubject->Request();};
private:RealSubject* m_realSubject;
};int main()
{Proxy* daili = new Proxy();daili->Request();delete daili;return 0;
}

为别人做嫁衣 --- 代理模式相关推荐

  1. 《大话设计模式》之--第7章 为别人做嫁衣----代理模式

    第7章 为别人做嫁衣----代理模式 7.1为别人做嫁衣 "小菜,今天见这个叫娇娇的美女见得如何呀?"大鸟一回家来就问小菜. "唉,别提了,人家是有男朋友的." ...

  2. 第7章 为别人做嫁衣----代理模式 大话设计模式

    第7章 为别人做嫁衣----代理模式 7.1为别人做嫁衣 "小菜,今天见这个叫娇娇的美女见得如何呀?"大鸟一回家来就问小菜. "唉,别提了,人家是有男朋友的." ...

  3. java设计模式之为别人做嫁衣----代理模式

    2019独角兽企业重金招聘Python工程师标准>>> 7.1为别人做嫁衣 "小菜,今天见这个叫娇娇的美女见得如何呀?"大鸟一回家来就问小菜. "唉,别 ...

  4. 为别人做嫁衣 代理模式

    7.1 为别人做嫁衣! 7.2 没有代理的代码 namespace 代理模式 {class Program{static void Main(string[] args){SchoolGirl jia ...

  5. 设计模式(三) | 为别人做嫁衣---代理模式

    代理模式 代理模式:为其他对象提供一种代理,以控制对这个对象的访问. 模式动机: 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为"代理"的第三者来实现 ...

  6. 为别人做嫁衣——代理模式

    代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式(Proxy)结构图 Subject类,定义了RealSuject和Proxy的共用的接口,这样就在任何使用RealSu ...

  7. 【设计模式】为别人做嫁衣 --- 代理模式

    一,概述 定义:代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象. 作用:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下 ...

  8. 为别人做嫁衣---代理模式

    引例 : 追求者(C),被追求者(B) ,代理者(A) 故事概要: A和B是好朋友, A喜欢B ,但A以C的名义去送给B礼物 1.没有代理 追求者类class Pursuit{SchoolGirl m ...

  9. 第七章 为别人做嫁衣—代理模式

    仅仅是个人学习笔记,不具备参考价值 在说一下代理模式的应用. (1)远程代理(Remote Proxy) -可以隐藏一个对象存在于不同地址空间的事实.也使得客户端可以访问在远程机器上的对象,远程机器可 ...

最新文章

  1. hdu 4417 Super Mario 划分树+二分
  2. 第一个问题就难倒我了!
  3. FPGA硬件学习基础知识点总结(1)
  4. 如何存储和恢复 HTML5 Canvas 状态
  5. 成都电讯学院研发的计算机,成都电讯工程学院
  6. EM算法的九层境界:​Hinton和Jordan理解的EM算法
  7. ios html清除缓存,iOS开发之1行代码实现缓存计算及清除缓存
  8. vue.js项目中,关于element-ui完整引入、按需引入的介绍
  9. linux中级之netfilter防火墙(firewalld)
  10. 计算机实战项目之 [含论文+开题报告+源码等]SSM图书馆预约占座系统[包运行成功]
  11. mysql环境变量配置还是不行_为什么要配置mysql环境变量
  12. WebView内通过浏览器打开链接
  13. Solr---string类型的docValues属性、stored属性
  14. 腾讯面试--测试工程师职位
  15. python:实现9×9二维数组数独算法(附完整源码)
  16. oracle 导入导出dum文件
  17. 黑马视频学习笔记-字符串
  18. 调息之法-整理的两篇有关养生的小文章
  19. 如何下载Chrome商店的插件crx到本地?
  20. [转]物理学家称曲率驱动或可实现10倍光速飞行

热门文章

  1. 电子万能试验机门式与单臂式结构,区别还是蛮大的
  2. macOS seria 10.12升级到macOS Mojave的报错:xcrun: error: invalid active developer path, missing xcrun...
  3. 美国单相三线制(线电压为相电压的2倍而非1.73倍)
  4. maven依赖报错问题处理
  5. 图片怎么放大比例?两个方法轻松放大
  6. 31条指令单周期cpu设计(Verilog)-(八)上代码→指令译码以及控制器
  7. iOS中的符号冲突(一)- 基础原理
  8. 睿爸信奥-【临阵磨枪】练习赛(第一场)- T3
  9. 微机原理——平方值查表
  10. 用3DS MAX制作简单的动画