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 once
class 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;
}