【设计模式】为别人做嫁衣 --- 代理模式
一,概述
定义:代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。
作用:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端 和目标对象之间起到中介的作用。
思想:为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。
虚拟(Virtual)代理(图片延迟加载的例子):根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。
Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
二,示例
描述:卓贾易让戴励送给李娇娇礼物,追求李娇娇。
1)小菜第一版代码
缺点:卓贾易直接行使送礼物类,不符合题目意思。
#include <iostream>
class SchoolGirl //要追的女孩
{
public:
void SetName(std::string str)//名字
{
m_Name = str;
};
std::string GetName(void) //获取女孩名字
{
return m_Name;
};
private:
std::string m_Name;
};
class Pursuit//追求行为类
{
public:
Pursuit(SchoolGirl* mm)
{
m_mm = mm;
};
void GiveDolls()
{
std::cout << m_mm->GetName() << "送你洋娃娃" << std::endl;
};
void GiveFlower()
{
std::cout << m_mm->GetName() << "送你鲜花" << std::endl;
};
void GiveChocolate()
{
std::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>
class SchoolGirl //要追的女孩
{
public:
void SetName(std::string str)//名字
{
m_Name = str;
};
std::string GetName(void) //获取女孩名字
{
return m_Name;
};
private:
std::string m_Name;
};
class Proxy//代理类,其实是戴励
{
public:
Proxy(SchoolGirl* mm)
{
m_mm = mm;
};
void GiveDolls()
{
std::cout << m_mm->GetName() << "送你洋娃娃" << std::endl;
};
void GiveFlower()
{
std::cout << m_mm->GetName() << "送你鲜花" << std::endl;
};
void GiveChocolate()
{
std::cout << m_mm->GetName() << "送你巧克力" << std::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>
class SchoolGirl //要追的女孩
{
public:
void SetName(std::string str)//名字
{
m_Name = str;
};
std::string GetName(void) //获取女孩名字
{
return m_Name;
};
private:
std::string m_Name;
};
class GiveGift //送礼物接口(抽象函数就是接口)
{
virtual void GiveDolls(void) = 0;
virtual void GiveFlower(void) = 0;
virtual void GiveChocolate(void) = 0;
};
class Pursuit :public GiveGift//追求者去实现礼物接口
{
public:
Pursuit(SchoolGirl* mm)
{
m_mm = mm;
};
void GiveDolls()
{
std::cout << m_mm->GetName() << "送你洋娃娃" << std::endl;
};
void GiveFlower()
{
std::cout << m_mm->GetName() << "送你鲜花" << std::endl;
};
void GiveChocolate()
{
std::cout << m_mm->GetName() << "送你巧克力" << std::endl;
};
private:
SchoolGirl* m_mm;
};
class Proxy :public GiveGift//代理类(也去实现送礼物接口,实际上是调用追求者的方法)
{
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;
}
三,代理模式的经典模板
class Subject
{
public:
virtual void Request(void) = 0;
};
class RealSubject : public Subject
{
public:
void Request(void)
{
std::cout << "真实的请求" << std::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;
}
【设计模式】为别人做嫁衣 --- 代理模式相关推荐
- 《大话设计模式》之--第7章 为别人做嫁衣----代理模式
第7章 为别人做嫁衣----代理模式 7.1为别人做嫁衣 "小菜,今天见这个叫娇娇的美女见得如何呀?"大鸟一回家来就问小菜. "唉,别提了,人家是有男朋友的." ...
- 第7章 为别人做嫁衣----代理模式 大话设计模式
第7章 为别人做嫁衣----代理模式 7.1为别人做嫁衣 "小菜,今天见这个叫娇娇的美女见得如何呀?"大鸟一回家来就问小菜. "唉,别提了,人家是有男朋友的." ...
- java设计模式之为别人做嫁衣----代理模式
2019独角兽企业重金招聘Python工程师标准>>> 7.1为别人做嫁衣 "小菜,今天见这个叫娇娇的美女见得如何呀?"大鸟一回家来就问小菜. "唉,别 ...
- 为别人做嫁衣 代理模式
7.1 为别人做嫁衣! 7.2 没有代理的代码 namespace 代理模式 {class Program{static void Main(string[] args){SchoolGirl jia ...
- 设计模式(三) | 为别人做嫁衣---代理模式
代理模式 代理模式:为其他对象提供一种代理,以控制对这个对象的访问. 模式动机: 在某些情况下,一个客户不想或者不能直接引用一个对 象,此时可以通过一个称之为"代理"的第三者来实现 ...
- 大话设计模式7:为别人做嫁衣——代理模式
1.代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. Subject类: Abstract class Subject { Publicabstract void Request ...
- 为别人做嫁衣---代理模式
引例 : 追求者(C),被追求者(B) ,代理者(A) 故事概要: A和B是好朋友, A喜欢B ,但A以C的名义去送给B礼物 1.没有代理 追求者类class Pursuit{SchoolGirl m ...
- 为别人做嫁衣——代理模式
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式(Proxy)结构图 Subject类,定义了RealSuject和Proxy的共用的接口,这样就在任何使用RealSu ...
- 第七章 为别人做嫁衣—代理模式
仅仅是个人学习笔记,不具备参考价值 在说一下代理模式的应用. (1)远程代理(Remote Proxy) -可以隐藏一个对象存在于不同地址空间的事实.也使得客户端可以访问在远程机器上的对象,远程机器可 ...
最新文章
- 大型互联网 b2b b2c o2o 电子商务云平台
- 在nginx上部署vue项目(history模式);
- (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新
- VM VirtualBox 虚拟机linux系统 登录密码忘记 ,重置
- phpvirtualbox+Virtualbox完整虚拟化环境部署
- 【动态规划】书的复制 (ssl 1203)
- 第一百一十四期:盘点十大最新Web UI测试工具
- watir-webdriver使用过程中异常
- 3dmax导出obj序列_Houdini导出序列图片
- UVA10465 Homer Simpson【递推】
- 华为matepad使用鸿蒙系统,首发鸿蒙系统!华为MatePad采用骁龙+麒麟双芯片版本,哪款更香?...
- html5音乐播放器在线生成,一款极简的HTML5音乐播放器-skPlayer
- 硕士生写小论文的经验(转载)
- mysql集群数据一致性校验
- 瑞萨e2studio(6)----编译调试
- 服务器虚拟化太金苹果效果好,《我的世界》金苹果更新速度太快,如今附魔金苹果“可遇不可求”...
- 乐鑫esp8266学习rtos3.0笔记第3篇: 一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。(附带demo)
- svg --- 可缩放矢量图形
- Windows、Mac系统常用的SSH工具软件整理汇总
- 【ESP系列】ESP8266-12F