设计模式之代理模式(C++)
2016-06-30 16:10
309 查看
代理模式:为其他对象提供一种代理以控制对这个对象的访问。
对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化,比如在一个文档编辑器中插入一个图片,有些图片的创建的开销很大,但是又要求打开文档速度要求很快,因此在打开文档时应该避免创建开销大的对象,因为并非打开文档时文档中的所有资源都必须可见,所以没必要一次性同时创建所有对象而应该在需要显示对应的资源也就是需要显示图片时才对图片就行加载和创建,这种解决方案即为“代理模式”,文档编辑器对象保存了这个图片对象的代理,而在需要显示图片时通过这个代理创建相关的图片资源。
代理模式的应用:
1、远程代理:为一个对象在不同的地址空间提供局部代表,比如说代理服务器为你在访问远程服务器时提供了 一个代理,使得访问速度变化。
2、虚代理:根据需要创建开销很大的对象。如上所说的图片代理。
3、保护代理:控制对原始对象的访问,用于对象有不同的访问权限的时候。
4、智能指引:取代了简单的指针,在访问对象时执行了一些附加的操作。如C++中的auto_ptr就是使用了代理模式,使我们可以不关注资源的释放。(执行附加的操作可以理解为对原始类作前处理和后处理等)
![](https://img-blog.csdn.net/20160630161048238?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
代码示例:
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;
}
对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化,比如在一个文档编辑器中插入一个图片,有些图片的创建的开销很大,但是又要求打开文档速度要求很快,因此在打开文档时应该避免创建开销大的对象,因为并非打开文档时文档中的所有资源都必须可见,所以没必要一次性同时创建所有对象而应该在需要显示对应的资源也就是需要显示图片时才对图片就行加载和创建,这种解决方案即为“代理模式”,文档编辑器对象保存了这个图片对象的代理,而在需要显示图片时通过这个代理创建相关的图片资源。
代理模式的应用:
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;
}
相关文章推荐
- 371. Sum of Two Integers
- 就C语言的指针、链表的原理和各类操作撰写一篇技术博客,说说自己学习C语言指针和链表的体会,并将学生信息管理系统进行修改,使能完成其他的功能,并撰写体会,附加源代码。
- 第14周 《C语言及程序设计》实践参考——工资的排序
- Reverse Integer(C++)
- C++回调函数实现
- C++指针详解
- C和C++混合编程(__cplusplus 与 external "c" 的使用)
- jni java类中本地方法 对应 C/C++中的函数命名规范
- C++ 11 std::function std::bind使用
- C语言内存思考题
- 第14周 《C语言及程序设计》实践参考——有序数组中插入数据
- C++开源log选用
- C++ 私有构造函数的作用
- c++中cin.clear()的重要性
- 深入探究C++的new/delete操作符
- LeetCode 214: Shortest Palindrome
- c++ primer 1.4.2节练习
- c++初识以及函数重载
- 字符串逆序总结
- c++ primer 入门练习题 1.4.1节