示例问题:
如何隐藏外界对一个对象的访问,且要使用该对象的功能?
分析:
代理模式,就是为其他对象提供一种代理以控制对这个对象的访问。
解决方案:
Proxy.h
其中CChildB类代理了CChildA类的功能
#pragma once
#include <iostream>
class CBase
{
public:
CBase()
{
}
virtual ~CBase()
{
}
virtual void DoSomething() = 0;
};
class CChildA : public CBase
{
public:
CChildA()
{
}
virtual ~CChildA()
{
}
void DoSomething()
{
std::cout << "I'm CChildA, do something" << std::endl;
}
};
class CChildB : public CBase
{
public:
CChildB()
{
}
virtual ~CChildB()
{
}
void DoSomething()
{
m_ChildA.DoSomething();
}
private:
CChildA m_ChildA;
};
main.cpp
// main.cpp : 定义控制台应用程序的入口点。
//
#include "Proxy.h"
int main()
{
CChildB ChildB;
ChildB.DoSomething();
system("pause");
return 0;
}
结果:
代理模式解决的问题:
代理模式,为其他对象提供一种代理以控制对这个对象的访问。
何时使用代理模式:
1. 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样就可以隐藏一个对象存在于不同地址空间的事实。
例如:WebService在.NET的应用,当在应用程序的项目中加入一个Web引用,引用一个WebService,此时会在项目中生成一个WebReference的文件夹和一些文件,其实这就是代理,使得客户端程序调用代理就可以解决远程访问的问题。
2. 虚拟代理,是根据需要,创建开销很大的对象,之后通过它来存放实例化需要很长时间的真实对象。
例如:当开发一个很大的html网页时,里面可能有很多的文字和图片,但你还是可以很快打开它,此时你所看到的是所有的文字,但是图片确实一张一张的慢慢才显示出来。那些最开始没有加载出来的图片,会有一个图片框或者默认背景,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。
3. 安全代理,用来控制真实对象访问时的权限。
例如:dll、lib的使用,也可理解成为一种代理模式。
4. 智能指引,是指当调用真实的对象时,代理处理另外一些事。
例如:计算真实对象的引用次数等。
返回目录:设计模式(C++实现)(总)