15. “接口隔离模式”之 Proxy模式

news2025/2/24 15:03:01

1. 动机

  • 在面向对象系统中,有些对象由于某些原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者、或者系统结构带来很多麻烦。
  • 如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。

2. 模式定义

        为其他对象提供一种代理以控制(隔离,使用接口)对这个对象的访问。

                                                                                                                ----《设计模式》GOF

3. 结构

Client是需要使用RealSubject的,正常情况下,Client需要声明一个Subject的指针,然后new的时候,new RealSubject,但是由于某种场景的限制,比如前面说的安全考虑,或者访问控制,不能直接去new这个具体的对象,这个时候,就可以使用Proxy,让Cline去生成一个Proxy的对象,在Proxy里面做一些额外的操作,然后再去调动RealSubject的接口。 

4. 代码示例

原始版本:

        

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();
        // ...
    }
};

但是由于某些原因,subject不能直接按照方面的方式进行new RealSubject

代码Ver2:

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

class ClientApp{
    ISubject *subject;
public:
    ClientApp()
    {
        subject = new SubjectProxy();
    }
    void DoTask(){
        // ...
        subject->process();
        // ...
    }
};

上面Ver2示例代码中代理模式维护了一个RealSubject的指针,但是一般情况下,可能不会这么用,而是更复杂的方式使用,不过这种使用方式也是可以的。

4. 要点总结

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

        (有些可能对组件模块提供抽象代理层,在架构层次对对象做proxy展开讲解:比如分布式系统,会大量的使用代理模式,举例,你要访问一个webService,这个webService比如说是amazon的webService你访问它,包括像现在非常流行的rust的这种架构,你拿到rust接口,比如新浪、微博、amazon、微信的一些rust接口,你在c++里面进行访问,往往会有一定的工具会帮你生成针对那个接口在客户端的代理类,那个代理类往往不是手工写,往往是工具自动实现的,手工写非常之复杂,因为你要控制所有网络访问的细节)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2675.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java中值得注意的『运算符、逻辑控制、输入输出』

目录前言一、运算符🍑1、取模运算符%🍑2、增量运算符🍑3、逻辑运算符🍑4、位运算符二、逻辑控制语句🍑1、switch语句三、Java输入和输出🍑1、输出到控制台🍑2、从键盘输入四、猜数字游戏——Jav…

软件过程与项目管理复习(1)

文章目录Week1Project Introduction定义特点Project management项目管理的价值项目管理的5要素Project manager项目经理的技能要求project manager 的核心任务(key activities)规划 planning组织 organizing领导 leading掌控 controllingAgile Scrum master 的核心任…

结构体超详解(小白一看就懂,多维度分析!!!!)

目录 一、前言 二、结构体详解 🍐什么是结构体 🍎结构体的定义与基础结构 🍑结构体的使用 💦结构体的初始化 💦结构体的成员访问 💦结构体数组 💦结构体指针--------------指向结构体变…

PNAS:人类头皮记录电位的时间尺度

导读 人类的许多行为都是由在不同时间尺度上发生的共同过程所支配的。标准的事件相关电位分析假设有关实验事件的响应持续时间是固定的。然而,最近对动物的单个单元记录显示,在需要灵活计时的行为中,神经活动尺度跨越了不同的持续时间。本研…

vue3——使用axios

1、Axios 是什么? 浏览器页面在向服务器请求数据时,因为返回的是整个页面的数据,页面都会强制刷新一下,这对于用户来讲并不是很友好。并且我们只是需要修改页面的部分数据,但是从服务器端发送的却是整个页面的数据,十…

Keras深度学习实战(33)——基于LSTM的序列预测模型

Keras深度学习实战(33)——基于LSTM的序列预测模型0. 前言1. 序列学习任务1.1 命名实体提取1.2 文本摘要1.3 机器翻译2. 从输出网络返回输出序列2.1 传统模型体系结构2.2 返回每个时间戳的网络中间状态序列2.3 使用双向 LSTM 网络小结系列链接0. 前言 在…

Qt易忘样式表总结

目录前言1、Qt设置样式的几种方式2、几种复合控件的样式设置QTableWidgetQCalendarWidgetQTreeWidgetQSpinBoxQComboBox前言 在使用Qt框架开发软件时,为了美观和更好的用户体验,需要为各种控件设置样式。一些通用且简单的样式如背景色、边框、字体字号等…

js实现图片懒加载

js实现图片懒加载 1、介绍getBoundingClientRect()函数 该函数没有参数,用于获取元素位置,返回一个对象,具有六个属性分别是: ele.getBoundingClientRect().top – 返回元素上边到视窗上边的距离 ele.getBoundingClientRect().l…

【经典面试题-LeetCode134:加油站问题(Java实现)】

加油站问题一、题目描述1.题目内容2.样例二、解决方案1.分析2.核心代码一、题目描述 1.题目内容 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i…

自动控制原理 - 2 控制系统的数学模型 节2.4-2.6

------------------------------------------------------------------------------ 2 控制系统的数学模型2.4 控制系统的传递函数2.5 典型环节的传递函数2.6 结构图的绘制 2 控制系统的数学模型 2.4 控制系统的传递函数 为何引入传递函数? 微分方程模型的优缺…

Webpack面试题总结

说说你对webpack的理解?解决了什么问题? webpack最初的目标是实现前端项目模块化,目的在于更高效的管理和维护项目中的每一个资源 模块化: 最早的时候,我们通过文件划分的形式实现模块化,也就是将每个功能…

JVM性能——开启回收日志和实时查看GC信息

JVM性能——开启回收日志和实时查看GC信息 JDK版本:OpenJDK 1.8.0_352-b08 操作系统:CentOS 7 如果文章内出现测试数据测试代码 depth:23 关于JVM的其他文章 JVM性能——垃圾回收器的优化策略 JVM性能——垃圾回收器的介绍 JVM性能——开启回收日…

网络赚钱项目 - 虚拟项目如何选择产品

今日一个老粉找我,他去年3月份就重视我跟我互动了,他上来并不是索取什么,而是给我信息,比如他最近测验了什么产品,什么产品好卖,都会把测验的数据告诉我,当然作为回报,我也会告诉他一…

Centos7宝塔部署python

前言:宝塔本身有python项目管理器,但是有些依赖安装会存在问题,比如paddlehub安装总是失败,本文在宝塔安装了anaconda基础上配合python项目管理器去部署项目,保障依赖隔离不混乱。 centos7宝塔安装conda流程地址&…

Linux使用YUM安装程序

目录 前言 什么是YUM? 1.本地源:系统安装光盘 目的 1)观察YUM核心配置目录 2)删除官方YUM库 3)编写本地YUM库配置文件 4)挂载安装光盘 保证把光盘放到服务器上,通电 挂载 5&#xff0…

np中的normalize/histogram/cumsum/interp函数

一、normalize函数 void normalize(InputArray src,OutputArray dst, double alpha=1, double beta=0, int norm_type=NORM_L2, int dtype=-1, InputArray mask=noArray() ) 归一化就是要把需要处理的数据经过处理后 (通过某种算法)限制在你需要的一定范围内。首先归一…

深入注册表监控

前言 注册表是windows的重要数据库,存放了很多重要的信息以及一些应用的设置,对注册表进行监控并防止篡改是十分有必要的。在64位系统下微软提供了CmRegisterCallback这个回调函数来实时监控注册表的操作,那么既然这里微软提供了这么一个方便…

用红黑树封装map和set

文章目录:红黑树模拟实现完整代码红黑树参数适配改造仿函数正向迭代器反向迭代器红黑树封装后的代码map完整代码set完整代码红黑树模拟实现完整代码 如下是红黑树kv模型的模拟实现完整代码,现在我们需要基于此代码封装出map和set基本的接口实现。 #pragma once #i…

音视频开发风潮 | 聊聊为啥从事音视频开发

音视频开发风潮 聊聊为啥从事音视频技术,未来会很赚钱 核心竞争力:音视频是程序界的皇冠,掌握音视频意味着拿到通往未来的船票,不用担心会被其他人替代。因为音视频是有一定门槛的,所以也是与其他人拉开差距的分水岭…

基于Linux的Spark安装与环境配置

文章目录基于Linux的Spark安装与环境配置1、Hadoop测试1.1 启动hadoop1.2 再次启动hadoop1.3 查看是否成功2、Scala安装与配置2.1 下载scala2.2 解压并重命名2.3 配置环境2.4 测试3、Spark安装与配置3.1 下载Spark3.2 解压并重命名3.3 配置环境3.4 配置spark-env.sh3.5 配置sla…