C++设计模式_15_Proxy 代理模式

news/2024/11/19 21:16:32/

Proxy 代理模式也是属于“接口隔离”模式,通过增加一层间接层来解决问题的模式。

文章目录

  • 1. 动机( Motivation)
  • 2. 模式定义
  • 3. 结构( Structure )
  • 4. 代码演示Proxy 代理模式
    • 4.1 常规方法
    • 4.2 Proxy 代理模式
  • 5. 要点总结
  • 6. 其他参考

1. 动机( Motivation)

  • 在面向对象系统中,有些对象由于某种原因 (比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等)直接访问会给使用者、或者系统结构带来很多麻烦。

  • 如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。
    所谓透明操作就是一致性,假如本来访问这个对象的方式是new一个对象,调用对象接口,那我还用类似方式访问你,至于背后的麻烦事,都不用知道,实现隔离。

2. 模式定义

为其他对象提供一种代理以控制(隔离,使用接口) 对这个对象的访问。
—《设计模式》GoF

3. 结构( Structure )

在这里插入图片描述
上图是《设计模式》GoF中定义的Proxy 代理模式的设计结构。结合上面的代码看图中最重要的是看其中稳定和变化部分,也就是下图中红框和蓝框框选的部分。
在这里插入图片描述

模式的结构很简单,但在实际使用过程中,可能会变得非常复杂。上图中接口为Subject,实际的对象为RealSubject,本来进行访问时,Client应该是直接声明一个Subject的接口,真正实际创建的是一个RealSubject的对象,但是由于某种特殊的原因,这时Client就应该直接去访问ProxyProxyRealSubject之间背后要做的事情很复杂。

4. 代码演示Proxy 代理模式

4.1 常规方法

以下是一个简单的示意性的例子,按照常规的做法,创建接口,RealSubject作为实际对象,ClientApp直接声明一个Subject的接口,真正实际创建的是一个RealSubject的对象。

client.cpp

//接口
class ISubject{
public:virtual void process();
};class RealSubject: public ISubject{
public:virtual void process(){//....}
};class ClientApp{ISubject* subject;public://构造器ClientApp(){subject=new RealSubject();}void DoTask(){//...subject->process();//....}
};

这种方式是不合适的,可能是由于性能、安全控制、分布式等原因,无法达到new RealSubject();此时应该怎么去做呢?

4.2 Proxy 代理模式

使用Proxy 代理模式模式的做法如下:

proxy.cpp

class ISubject{
public:virtual void process();
};//Proxy的设计
class SubjectProxy: public ISubject{public:virtual void process(){//对RealSubject的一种间接访问//....}
};class ClientApp{ISubject* subject;public:ClientApp(){subject=new SubjectProxy();}void DoTask(){//...subject->process();//....}
};

proxy.cpp有时候是自己写,有时候是使用工具生成的。创建接口class SubjectProxy: public ISubject,SubjectProxy实现一种对RealSubject的间接访问,在class ClientApp中创建subject=new SubjectProxy();SubjectProxy()针对RealSubject()的代理

Proxy 代理模式常常会设计的比较复杂,但是整体的设计思想要进行理解。

5. 要点总结

  • “增加一层间接层”是软件系统中对许多复杂问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的proxy对象便是解决这一问题的常用手段。
  • 具体proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能对组件模块提供抽象代理层,在架构层次对对象做proxy。

具体到实际中,以下代码的差异度相当大,总体设计思想遵循:代理类(SubjectProxy)和实际类(RealSubject)的接口(ISubject)是一致的

    virtual void process(){//对RealSubject的一种间接访问//....}

copy-on-write技术:字符串类中经常如此去做,如果对象没有什么更改的话,复制的话,内部会生成一个指针指向原来的对象,每拷贝一次都是浅拷贝,这种共享在当你需要改这个对象时就是有问题的,此时你就需要内部拷贝一份,实现一种代理
在分布式系统中会大量使用Proxy 代理模式

  • Proxy并不一定要求保持接口完整的一致性,只要能够实现间接控制,有时候损及一些透明性是可以接受的。

代理的核心思想是增加一个中间层,实现不为外界所知的功能

6. 其他参考

C++设计模式——代理模式


http://www.ppmy.cn/news/1186348.html

相关文章

GoLand GC(垃圾回收机制)简介及调优

GC(Garbage Collector)垃圾回收机制及调优 简单理解GC机制 其实gc机制特别容易理解,就是物理内存的自动清理工。我们可以把内存想象成一个房间,程序运行时会在这个房间里存放各种东西,但有时候我们会忘记把不再需要的东西拿出去&#xff0c…

leetcode_811. 子域名访问计数

题目链接:https://leetcode.cn/problems/subdomain-visit-count/description/ 涉及知识点:库函数atoi,库函数strstr,库函数strchr,库函数sprintf,UT_hash 解法一:自己构造结构体 #define LEN…

lv8 嵌入式开发 网络编程开发 21 私有云盘项目

目录 1云盘项目简介 2 项目实现 2.1 首先实现TCP客户端、服务端 2.2 实现客户端函数简化 2.3 实现服务端函数简化 2.4 TCP数据连包现象 2.5 封装send函数和recv函数 2.6 建立readme说明 2.7 实现文件传输 2.8 读取配置文件种的ip、端口号,通过argv[1]参数实现文件传输…

pytorch:R-CNN的pytorch实现

pytorch:R-CNN的pytorch实现 仅作为学习记录,请谨慎参考,如果错误请评论指出。 参考文献:Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation      https://blog.csdn.net/qq_41694024/cat…

邮件怎样批量发送不同附件?邮件群发技巧?

如何批量发送不同附件的邮件?发送带不同附件邮件的方法? 当你需要向多个收件人发送带有不同附件的邮件时,可能会感到有些棘手。批量发送不同附件的邮件功能将成为你的得力助手。蜂邮EDM将介绍如何使用这一功能,轻松高效地发送多个…

TypeScript - 函数 -函数的默认参数

默认参数是个啥 如果不特殊指明,函数的参数都是必传的。但是,ts中提供了默认参数这一操作, 作用就是,给参数指定一个 默认的值,当调用函数而又未传这个参数时,就直接使用默认值。怎么写默认参数 默认参数的…

write_edif 生成 AD9361 配置的自定义IP核

将AD9361配置文件设置为顶层 设置里; -mode out_of_context 替换文字 综合 导出 IP 核 write_edif -security_mode all D:/tops.edfD:/tops.edf write_verilog -mode synth_stub D:/tops_stub.vD:/tops_stub.v 调用 AD9361 IP 核

协同网络入侵检测CIDS

协同网络入侵检测CIDS 1、概念2、CIDS的分类3、解决办法4、CIDS模型5、挑战与不足 ⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计2598字,阅读大概需要3分钟 🌈更多学习内容&…