C++设计模式结构型之代理模式

一、概述

代理模式是一种结构型模式,在很多不同的场合具有广泛的分类和应用。其主要实现的思想是在客户端和真正要访问的对象之间引入一个

代理对象(间接层),于是,以往客户端对真正对象的访问现在变成了通过代理对象进行访问,代理对象在这里起到了一个中介或者桥梁作用。

引入代理对象的目的主要是可以为客户端增加额外的功能、约束或者针对客户端的调用屏蔽一些复杂的细节问题。

二、基本概念与示例

代理模式的实质是通过引入一个代理类来为原始类(被代理类)增加额外的能力,这些额外的能力可能是指一些新功能、新服务,也可能

是一些约束或者限制等。那么现在试着考虑一个例子,通过浏览器访问某个网站,最简单的方式就是在浏览器中输入网站的地址来直接访问。

class CWebAddr

{

public:

virtual void visit() = 0;

virtual ~CWebAddr(){}

};

class CWebAddr_Shopping : public CWebAddr

{

public:

virtual void visit()

{

//访问购物网站复杂通信逻辑

cout << "访问CWebAddr_Shopping购物网站" << endl;

}

};

class CWebAddr_Video : public CWebAddr

{

public:

virtual void visit()

{

//访问视频网站复杂通信逻辑

cout << "访问CWebAddr_Video视频网站" << endl;

}

};

//主函数

int main()

{

CWebAddr *pShopping = new CWebAddr_Shopping();

pShopping->visit();

CWebAddr *pVideo = new CWebAddr_Video();

pVideo->visit();

delete pShopping;

delete pVideo;

return 0;

}

上述代码执行结果没问题,描述主要是直接访问某个或者某些网站,那么我们也可以引入代理类帮助我们访问这些网站,

针对以上代码做出调整:

class CWebAddrProxy : public CWebAddr

{

public:

CWebAddrProxy(CWebAddr* pWebAddr) : m_webAddr(pWebAddr){}

public:

virtual void visit()

{

m_webAddr->visit();

}

private:

CWebAddr* m_webAddr;

};

//主函数

int main()

{

CWebAddr *pShopping = new CWebAddr_Shopping();

CWebAddr *pVideo = new CWebAddr_Video();

CWebAddrProxy *pWebproxy1 = new CWebAddrProxy(pShopping);

pWebproxy1->visit();

CWebAddrProxy *pWebproxy2 = new CWebAddrProxy(pVideo);

pWebproxy2->visit();

delete pShopping;

delete pVideo;

delete pWebproxy1;

delete pWebproxy2;

return 0;

}

三、代理模式定义与角色

引入代理模式的定义:为其他对象提供一种代理,以控制对这个对象的访问。代理模式通过创建代理对象来代表真实对象,客户端操作代理

对象与操作真实对象并没有什么不同。当然,最核心、最本质的功能,最终还是需要代理对象操纵真实对象来完成。

代理模式UML图中涉及三个角色:

(1)Subject(抽象对象)。该类定义真实主题与代理主题的共同接口,这样,在真实主题的地方都可以使用代理主题。

(2)Proxy(代理主题)。该类内部包含了对真实主题的引用,从而可以对真实主题进行访问。代理主题中一般会提供与真实主题相同的接口,以

达到可以取代真实主题的目的。同时也可以对真实主题的访问进行约束和限制,也能够控制必要时的创建/删除真实主题。

(3)RealSubject(真实主题)定义代理主题代表的真实对象,真正的业务是在真实主题中实现的,客户端通过代理主题间接访问真实主题中的

接口。

四、代理模式的应用场合

代理模式UML图分厂简单,总结起来也简单----在软件设计中,增加间接层来获取更大的灵活性和增加更多的控制。在实际中,代理模式可能

会在许多场合得到应用,并且其实现可能会非常复杂。

1)远程代理

2)虚拟代理

3)保护代理

4)缓存/缓冲代理

5)智能引用代理

6)写时复制优化代理

相关推荐
从零开始的代码生活_13 小时前
C++ 内存管理:从内存分区到 new/delete 底层原理
开发语言·c++·后端
aaPIXa62214 小时前
C++ 用 13 条规则让模型写出安全现代 C++
java·c++·安全
枕星而眠15 小时前
【数据结构】红黑树入门指南
运维·数据结构·c++·后端
2601_9498177215 小时前
C++指针与引用深度精讲:底层原理、差异对比与高阶实战陷阱
java·jvm·c++
烟锁池塘柳017 小时前
【C/C++】解决C++控制台输出中文乱码问题
c语言·开发语言·c++
zh路西法17 小时前
【10天速通Navigation2】(九):LQR最优控制器的原理推导与Nav2插件实现
c++·ros2·最优控制·lqr·navigation2
粘稠的浆糊17 小时前
[AtCoder - abc465_d ]X to Y题解
数据结构·c++·算法
誰能久伴不乏17 小时前
C++11 随机数生成——告别 rand()
开发语言·c++
KouFiee18 小时前
同名隐藏基础
开发语言·c++
从零开始的代码生活_18 小时前
C++ string 详解:常用接口、字符串算法与深拷贝实现
开发语言·c++·后端·学习·算法