第七章 为别人做嫁衣-代理模式(读书笔记)

来源:互联网 发布:商周青铜器 知乎 编辑:程序博客网 时间: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;}

 

 

原创粉丝点击