结构型模式之代理模式(Proxy)

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

2. 动机

因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象的一个替身。即代理对象。它可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务

例子1:经典例子就是网络代理,你想访问facebook或者twitter ,如何绕过GFW,找个代理网站。

例子2:可以调用远程代理处理一些操作如图:


3.分类


在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用 Proxy模式。下面是一些可以使用Proxy模式常见情况:

1) 远程代理(Remote  Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
2) 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 
3) 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
4) 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。
5) Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。

4.C++举例

#ifndef PROXY_H
#define PROXY_H
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;
class CImage{
public:
	virtual void Display()=0;
};
class CRealImage : public CImage{
private:
	string m_ImageName;
public:
	CRealImage(){}
	CRealImage(string temp){
		m_ImageName=temp;
		LoadImage();
	}
	virtual void  Display(){
		cout<<"Displaying "<<m_ImageName<<endl;
	}
	void LoadImage(){
		cout<<"Loading "<<m_ImageName<<endl;
	}
};
class CProxyImage : public CImage{
private:
	string m_ImageName;
	CRealImage* m_Image;
public:
	CProxyImage(){}
	CProxyImage(string temp) : m_ImageName(temp),m_Image(NULL){}
	virtual void Display(){
		if(m_Image==NULL)
		{
			m_Image=new CRealImage(m_ImageName);
		}
		m_Image->Display();
	}
};
#endif



#include <iostream>
#include "Proxy.h"
int main(){
	CProxyImage proxy("beauty.jpg");//只有图片名称,没有创建实例。
	proxy.Display();//在使用时创建图片实例并加载,然后显示。
	proxy.Display();//由于已经创建,因此只需显示即可。
	return 0;
}




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中常见的结构型模式包括以下几种: 1. 适配器模式(Adapter Pattern):将一个类的接口转换成客户希望的另外一个接口。适配器模式可以让原本不兼容的类可以协同工作。 2. 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式可以减少系统中类的数量,并降低它们之间的耦合。 3. 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式可以使客户端可以像处理单个对象一样来处理对象的组合。 4. 装饰模式(Decorator Pattern):动态地给一个对象添加一些额外的职责,同时又不改变其原有的结构。装饰模式可以在不修改对象的基础上给对象增加新的行为。 5. 外观模式(Facade Pattern):为子系统中的一组接口提供一个统一的接口,以便更方便地访问子系统中的功能。外观模式可以简化客户端与子系统之间的交互。 6. 享元模式(Flyweight Pattern):运用共享技术有效地支持大量细粒度的对象。享元模式可以提高系统的性能和资源利用率。 7. 代理模式Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。代理模式可以增加额外的逻辑,比如权限控制、缓存等。 这些模式都有各自的优点和适用场景,在实际开发中可以根据需求选择合适的结构型模式进行设计和实现。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值