c++设计模式-----代理模式proxy

代理模式:

                                                      clip_image012

意图:

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

适用性:

在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。下面是一 些可以使用Proxy 模式常见情况: 
1) 远程代理(Remote Proxy )为一个对象在不同的地址空间提供局部代表。 NEXTSTEP[Add94] 使用NXProxy 类实现了这一目的。Coplien[Cop92] 称这种代理为“大使” (Ambassador )。 
2 )虚代理(Virtual Proxy )根据需要创建开销很大的对象。在动机一节描述的ImageProxy 就是这样一种代理的例子。 
3) 保护代理(Protection Proxy )控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。例如,在Choices 操作系统[ CIRM93]中KemelProxies为操作系统对象提供 了访问保护。 
4 )智能指引(Smart Reference )取代了简单的指针,它在访问对象时执行一些附加操作。 它的典型用途包括:

对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为SmartPointers[Ede92 ] )。

当第一次引用一个持久对象时,将它装入内存。

在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。


[DP]上的定义:为其他对象提供一种代理以控制对这个对象的访问。有四种常用的情况:(1)远程代理,(2)虚代理,(3)保护代理,(4)智能引用。本文主要介绍虚代理和智能引用两种情况。

       考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。这是[DP]一书上的给的例子。下面给出代理模式的UML图。



#include <iostream>
#include <string>
using namespace std;
class Image
{
public:
	Image(string name) : m_imageName(name) {}
	virtual ~Image() {}
	virtual void Show() {}
protected:
	string m_imageName;
};
class BigImage : public Image
{
public:
	BigImage(string name) :Image(name) {}
	~BigImage() {}
	void Show() { cout << "Show big image : " << m_imageName << endl; }
};
class BigImageProxy : public Image
{
private:
	BigImage *m_bigImage;
public:
	BigImageProxy(string name) :Image(name), m_bigImage(0) {}
	~BigImageProxy() { delete m_bigImage; }
	void Show()
	{
		if (m_bigImage == NULL)
			m_bigImage = new BigImage(m_imageName);
		m_bigImage->Show();
	}
};

int main()
{
	Image *image = new BigImageProxy("proxy.jpg"); //代理
	image->Show(); //需要时由代理负责打开
	delete image;
	return 0;
}

关于智能指针auto_ptr和smart_ptr的实现各大网络博客上都有。这篇博客是参考别人的博客写的,觉得没什么好写的,下次复习的再认认真真重新写这篇博客吧,工作太忙了,实在没时间自学,垃圾中兴,迟早我会离开的中兴的。








                              

                                      

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的C++代码示例,演示了如何使用代理模式: 首先,定义一个接口,作为代理和实际对象的共同接口: ```c++ class Image { public: virtual void display() = 0; }; ``` 然后,实现接口的实际对象: ```c++ class RealImage : public Image { private: std::string fileName; public: RealImage(std::string fileName) { this->fileName = fileName; loadFromDisk(fileName); } void display() override { std::cout << "Displaying " << fileName << std::endl; } void loadFromDisk(std::string fileName) { std::cout << "Loading " << fileName << std::endl; } }; ``` 接下来,实现代理对象,代理对象会在调用实际对象前进行一些额外操作: ```c++ class ProxyImage : public Image { private: RealImage* realImage; std::string fileName; public: ProxyImage(std::string fileName) { this->fileName = fileName; } void display() override { if (realImage == nullptr) { realImage = new RealImage(fileName); } realImage->display(); } }; ``` 最后,我们可以使用代理对象来访问实际对象,代理对象会在访问实际对象前进行一些额外操作,比如加载图片: ```c++ int main() { Image* image = new ProxyImage("test.jpg"); // 图像从磁盘加载 image->display(); std::cout << std::endl; // 图像不需要从磁盘加载 image->display(); } ``` 输出为: ``` Loading test.jpg Displaying test.jpg Displaying test.jpg ``` 在这个例子中,我们使用代理对象来控制访问实际对象,代理对象会在访问实际对象前进行一些额外操作,比如加载图片。这种设计模式可以用来实现远程代理、虚拟代理、保护代理等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值