第七章 为别人做嫁衣-代理模式(读书笔记)
来源:互联网 发布:商周青铜器 知乎 编辑:程序博客网 时间:2024/06/02 10:12
1.代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
2.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不用地址空间的事实。
3.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。打开网页时代理存储了真实图片的路径和尺寸,这个就是虚拟代理。
4.安全代理:用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
5.智能指引:是指当调用真实的对象时,代理处理另外一些事。如计算真实对象的引用次数。
7.2 在没有代理模式的情况下
7.2.1 SchoolGirl.h
#pragma once#include <string>class SchoolGirl{public:void SetName(std::string str){m_Name = str;};std::string GetName(void){return m_Name;};private:std::string m_Name;};
7.2.2 Pursuit.h
#pragma once #include <iostream>#include "SchoolGirl.h"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;};
7.2.3 调用的客户端
#include "stdafx.h"#include "Pursuit.h"int _tmain(int argc, _TCHAR* argv[]){SchoolGirl* jiaojiao = new SchoolGirl();jiaojiao->SetName("李娇娇");//事实上娇娇并不认识卓贾易Pursuit* zhuojiayi = new Pursuit(jiaojiao);zhuojiayi->GiveChocolate();zhuojiayi->GiveDolls();zhuojiayi->GiveFlower();delete jiaojiao;delete zhuojiayi;return 0;}
7.3 代理模式来了,但是在这里只是换了个名字而已。不是真正的代理。
7.3.1 SchoolGirl.h同上,不做修改
7.3.2 Proxy.h
#pragma once#include "SchoolGirl.h"#include <iostream>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;};
7.3.3 调用的客户端
#include "stdafx.h"#include "Proxy.h"int _tmain(int argc, _TCHAR* argv[]){SchoolGirl* jiaojiao = new SchoolGirl();jiaojiao->SetName("李娇娇");Proxy* daili = new Proxy(jiaojiao);daili->GiveChocolate();daili->GiveDolls();daili->GiveFlower();return 0;}
7.4 代理模式
GiveGift是一个接口类,接口的内容就是送礼物的函数, 在类Pursuit中实现这些送礼物的函数.在代理类中控制类Pursuit的新规和消亡.当调用代理类的送礼物函数的时候,通过代理中保有的Pursuit调用类Pursuit的送礼物函数,再通过调用Pursuit类中的m_mm指针找到李娇娇.
7.4.1 SchoolGirl.h同上,没有修改
7.4.2 Pursuit.h
#pragma once#include "SchoolGirl.h"#include <iostream>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: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;};
7.4.3 调用的客户端, 代理在知道李娇娇以后,就可以直接送礼物了.
#include "stdafx.h"#include "Pursuit.h"int _tmain(int argc, _TCHAR* argv[]){ SchoolGirl* jiaojiao = new SchoolGirl(); jiaojiao->SetName("李娇娇"); Proxy* daili = new Proxy(jiaojiao); daili->GiveChocolate(); daili->GiveDolls(); daili->GiveFlower(); return 0;}
7.6 代理模式的教科书代码,要在代理中封装真实对象的创建和消亡.最好接口的名字用同一个,这样就不会弄错.
7.6.1 Subject.h
#pragma onceclass Subject{public:virtual void Request(void) = 0;};
7.6.2 RealSubject.h
#include "subject.h"#include <iostream>class RealSubject : public Subject{public:void Request(void){std::cout << "真实的请求" << std::endl;};};
7.6.3 Proxy.h
#pragma once#include "realsubject.h"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;};
7.6.5 客户端调用
#include "stdafx.h"#include "Proxy.h"int _tmain(int argc, _TCHAR* argv[]){Proxy* daili = new Proxy();daili->Request();delete daili;return 0;}
- 第七章 为别人做嫁衣-代理模式(读书笔记)
- 第七章 为别人做嫁衣---代理模式(读书笔记)
- 第七章 为别人做嫁衣—代理模式
- 代理模式-为别人做嫁衣
- 为别人做嫁衣---代理模式
- 代理模式-为别人做嫁衣
- 为别人做嫁衣 --- 代理模式
- 2. 代理模式-为别人做嫁衣
- 【设计模式】为别人做嫁衣 --- 代理模式
- 为别人做嫁衣裳——代理模式
- 为别人做嫁衣——代理模式
- 代理模式(Python版)---为别人做嫁衣
- 代理模式实现为别人做嫁衣 C++
- 《大话设计模式》之--第7章 为别人做嫁衣----代理模式
- 《大话设计模式》之--第7章 为别人做嫁衣----代理模式
- 第7章 为别人做嫁衣----代理模式 大话设计模式
- 大话设计模式-第07章 为别人做嫁衣--代理模式
- 大话设计模式7:为别人做嫁衣——代理模式
- 第二十七章 配置Action范围国际化资源文件
- 第二十八章 ognl表达式
- oracle 总结
- JLINK烧写步骤
- 从头开始为BeagleBoard编译Android系统
- 第七章 为别人做嫁衣-代理模式(读书笔记)
- 第九章 简历复印-原型模式(学习笔记)
- 【Android进阶】天天动听 悬浮歌词(迷你歌词)效果解读
- 第八章 雷锋依然在人间-工厂方法模式(读书笔记)
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
- 改变Eclipse背景色
- 交换机的工作原理浅析
- 利用tcl脚本文件配置FPGA硬件引脚
- Android 内存监测工具 DDMS --> Heap