C++代理模式(Proxy)
UML类图(仅供参考)如下:
代理模式解决的问题:
由于某些原因,一个类(A)不能直接被客户端使用,所以我们可以创建这个类的代理类(B),实际上B就是A的影子而已
源码
#include <iostream>
#include <string>
// 接口
class CImage
{
public:
CImage(const std::string &name) :m_ImageName(name) {}
virtual ~CImage() {}
// 该方法可以实现一个特定的功能
virtual void Show() = 0;
protected:
std::string m_ImageName;
};
// 继承类
// 由于某些原因,这个类不能被直接使用,所以只能被代理
class CBigImage :public CImage
{
public:
CBigImage(const std::string &name) :CImage(name) {}
virtual ~CBigImage() {}
// 实现具体的功能
virtual void Show()
{
std::cout << "Show big image:" << m_ImageName << std::endl;
}
};
// CBigImage的代理类
// 目的就是让客户感觉这个CBigImageProxy与CBigImage没有什么差别
// 但实际上使用的还是CBigImage的show方法,达到的效果就是隐藏CBigImage类
class CBigImageProxy :public CImage
{
public:
CBigImageProxy(const std::string &name) :CImage(name), m_BigImage(NULL)
{
m_BigImage = new CBigImage(m_ImageName);
}
virtual ~CBigImageProxy()
{
if (NULL != m_BigImage)
{
delete m_BigImage;
m_BigImage = NULL;
}
}
virtual void Show()
{
// 其实使用的就是CBigImage的show方法,且不能做其他多余的事情
m_BigImage->Show();
}
private:
CBigImage *m_BigImage;
};
int main()
{
CImage *Image = new CBigImageProxy("asd");
Image->Show();
delete Image;
}
好处
略