设计模式之代理模式(C++)

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化,比如在一个文档编辑器中插入一个图片,有些图片的创建的开销很大,但是又要求打开文档速度要求很快,因此在打开文档时应该避免创建开销大的对象,因为并非打开文档时文档中的所有资源都必须可见,所以没必要一次性同时创建所有对象而应该在需要显示对应的资源也就是需要显示图片时才对图片就行加载和创建,这种解决方案即为“代理模式”,文档编辑器对象保存了这个图片对象的代理,而在需要显示图片时通过这个代理创建相关的图片资源。


代理模式的应用:

1、远程代理:为一个对象在不同的地址空间提供局部代表,比如说代理服务器为你在访问远程服务器时提供了 一个代理,使得访问速度变化。

2、虚代理:根据需要创建开销很大的对象。如上所说的图片代理。

3、保护代理:控制对原始对象的访问,用于对象有不同的访问权限的时候。

4、智能指引:取代了简单的指针,在访问对象时执行了一些附加的操作。如C++中的auto_ptr就是使用了代理模式,使我们可以不关注资源的释放。(执行附加的操作可以理解为对原始类作前处理和后处理等)




代码示例:

Graphic.h

#include <iostream>

class Graphic
{
public:
	void virtual Draw()=0;
	virtual ~Graphic();
};

class Image :Graphic
{
public:
	Image(std::string  str);
	virtual ~Image();
	virtual void Draw();

private:
	std::string filename;
};

class ImageProxy : Graphic
{
public:
	ImageProxy(std::string  str);
	virtual void Draw();
	virtual ~ImageProxy();
private:
	Image* pImg;
	std::string filename;
};

Graphic.cpp

#include "Graphic.h"

Graphic::~Graphic()
{}

Image::Image(std::string  str)
{
	filename = str;
}

void Image::Draw()
{
	std::cout << filename.c_str() << "  Image Show" << std::endl;
}

Image::~Image()
{}


ImageProxy::ImageProxy(std::string  str)
{
	filename = str;
}

void ImageProxy::Draw()
{
	if (pImg == NULL)
		pImg = new Image(filename);
	pImg->Draw();
}

ImageProxy::~ImageProxy()
{
	if (NULL != pImg)
		delete pImg;
}

客户端代码:

#include"Graphic.h"

int main()
{
	ImageProxy img("ImageFileName.jpg");
	img.Draw();
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值