C++设计模式:代理模式(十三)

news2025/6/8 12:05:34
1、代理模式
  • 定义:为其他对象提供一种代理以控制(隔离使用接口)对这个对象的访问等。

  • 动机

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

    • 代理模式在一些例如AOP编程中大量的使用动态代理模式
    • AOP概念:面向切面编程,英文全称Aspect Oriented Programming;AOP是OOP编程的延伸,也是软件开发中的一个热点,也是Java语言Spring框架中的一个重要组成部分,是函数式编程的一种衍生范型。
    • AOP作用:利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
    • AOP原理:AOP底层是通过动态代理(接口代理、Cglib代理)。通过动态代理可以在程序运行的时候针对某些功能进行逻辑层面的增强,从而达到在不修改源代码的情况下能够使得某些方法功能加强,当不需要增强时直接去掉代理,也不用修改源代码!总之:AOP的作用就是解耦!
      在这里插入图片描述
2、案例分析
2.1、基础实现
class ISubject{
public:
    virtual void process() = 0;
};
class RealSubject: public ISubject{
public:
    virtual void process() override{
        // .....
    }
};
class ClientApplication{
private:
    ISubject *subject;
public:
    ClientApplication(ISubject *iSubject): subject(iSubject){

    }
    void DoTask(){
        subject->process();
    }
};
  • 假设现在有一个ISubject的接口和一个实现子类、在ClientApplication类中需要依赖这个接口和子类、很朴素的做法就是在通过注入的方式加入进来,也可以通过工厂方法等方式搞一个ISubject的子类么。
  • 但其实这种做法包括工厂等都有一个大前提条件,就是依赖的这个ISubject的接口、子类与当前需要使用的类ClientApplication接口在同一个进程中或者同一个项目下,这样就能保证加载到么。
2.1、代理模式
  • 而如果在一些分布式系统中,不同项目之间通常有一些接口功能的调用请求,通过一些手段加载到当前项目中。

  • 这种调用等一些操作都会通过RPC或者GRPC一些远程调用的方式来加载这个对象,此时这种直接注入的方式就无效了。

  • 这时候代理模式就体现出它的作用了,通过加上代理层代理所需对象的功能,所需对象的加载在这里完成并且调用,对外暴露接口让ClientApplication调用。

  • 这样做的好处是:

    • 首先是透明的:ClientApplication对这个只管使用并不关心它怎么来的
    • 其次是高内聚低耦合:代理的过程放到一个方法中,而不融入到调用的地方。这样就功能高度内聚,接口之间低耦合。
class ISubject{
public:
    virtual void process() = 0;
};
class SubjectProxy: public ISubject{
public:
    virtual void process() override{
        /*
         * 对RealSubject的一种间接访问
         * 这其中伴随着很复杂的一些过程
         * 总之这里可能会获取到一个RealSubject的对象
         */
        RealSubject realSubject = ....;
        realSubject.process();
    }
};
class ClientApplication{
private:
    ISubject *subject;
public:
    ClientApplication(ISubject *proxySubject): subject(proxySubject){
        
    }
    void DoTask(){
        subject->process();
    }
};
3、总结
  • “增加一层”是软件系统重对许多复杂问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的proxy对象便是解决这一问题的常用手段。

  • 具体proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能对组件模块提供抽象代理层,在架构层次对对象做proxy(例如aop)

  • Proxy并不一定要求保持接口完整的一致性,只要能够实现间接控制,有时候损失一些透明性也是可以接受的。
    在这里插入图片描述

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

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

相关文章

基于Docker构建CI/CD工具链(六)使用Apifox进行自动化测试

添加测试接口 在Spring Boot Demo项目里实现一个简单的用户管理系统的后端功能。具体需求如下: 实现了一个RESTful API,提供了以下两个接口 : POST请求 /users:用于创建新的用户。GET请求 /users:用于获取所有用户的列…

【日常记录】【CSS】利用动画延迟实现复杂动画

文章目录 1、介绍2、原理3、代码4、参考链接 1、介绍 对于这个效果而言,最先想到的就是 监听滑块的input事件来做一些操作 ,但是会发现,对于某一个节点的时候,这个样式操作起来比较麻烦 只看这个代码的话,发现他用的是动画&#x…

什么是T型槽铸铁平板中内应力——河北北重厂家

T型槽铸铁平板中的内应力指的是平板内部受到的内部力,包括拉应力和剪应力。在T型槽铸铁平板使用过程中,由于自身重量、外力加载等原因,会产生内部应力。这些内应力是平板内部各部分之间的相互作用力,使得平板各部分受到不同的拉伸…

部署HDFS集群(完全分布式模式、hadoop用户控制集群、hadoop-3.3.4+安装包)

目录 前置 一、上传&解压 (一 )上传 (二)解压 二、修改配置文件 (一)配置workers文件 (二)配置hadoop-env.sh文件 (三)配置core-site.xml文件 &…

【深度学习】图像风格混合——StyleGAN2原理解析

1、前言 上一篇文章,我们详细讲解了StyleGAN的原理。这篇文章,我们就来讲解一下StyleGAN2,也就是StyleGAN的改进版。 原论文:Analyzing and Improving the Image Quality of StyleGAN 参考代码:①Pytorch版本&#…

腐蚀Rust 服务端搭建架设个人社区服务器Windows教程

腐蚀Rust 服务端搭建架设个人社区服务器Windows教程 大家好我是艾西,一个做服务器租用的网络架构师也是游戏热爱者。最近在steam发现rust腐蚀自建的服务器以及玩家还是非常多的,那么作为服务器供应商对这商机肯定是不会放过的哈哈哈! 艾西这…

wangeditor与deaftjs的停止维护,2024编辑器该如何做技术选型(一)

wangeditor暂停维护的声明: wangeditor是国内开发者开发的编辑器,用户也挺多,但是由于作者时间关系,暂停维护。 deaft的弃坑的声明: draft是Facebook开源的,但是也弃坑了,说明设计的时候存在很大…

第二证券策略:股指预计维持震荡格局 关注汽车、工程机械等板块

第二证券指出,指数自今年2月份阶段低点反弹以来,3月份持续高位整理。进入4月份之后面对年报和一季报的双重财报发表期,预计指数短期保持高位整理概率比较大。前期缺乏成绩支撑的概念股或有回落的危险,主张重视成绩稳定、估值低、分…

Redis队列与Stream

Redis队列与Stream、Redis 6多线程详解 Redis队列与StreamStream总述常用操作命令生产端消费端单消费者消费组消息消费 Redis队列几种实现的总结基于List的 LPUSHBRPOP 的实现基于Sorted-Set的实现PUB/SUB,订阅/发布模式基于Stream类型的实现与Java的集成消息队列问…

Tuxera Ntfs for mac 2023中文解锁版安装、密钥下载与激活教程 Tuxera激活码 tuxera破解

Tuxera Ntfs for mac2023是Mac中专用于读写外置存储的工具,具有强大的磁盘管理和修复功能,它在Mac上完全读写NTFS格式硬盘,快捷的访问、编辑、存储和传输文件。能够在 Mac 上读写 Windows NTFS 文件系统。Tuxera NTFS 实现在Mac OS X系统读写…

根据ELK官网指引部署ELK- ECK-Elastic-​ Kibana​-Learn-ELK-(一)

**Attention: 1、You need open the ELK official website and step by step to deploy . 2、If you copy my command ,you must check them if it not match your environment . 一、official website Elastic documentation | Elastic Check there. 二、 ECK简介…

napi系列学习高阶篇——通过IDE集成C/C++三方库并开发napi接口

简介 应用在调用系统固件集成的C/C三方库时,可能会由于系统固件集成端与IDE的NDK中libc版本不一致导致调用失败,而且系统固件集成的C/C三方库对于应用的调式也很不友好,需要多方编译调试,很不方便。因此本文将通过在IDE上适配ope…

文件IO/标准IO

1.标准I/O 标准: 任何操作系统皆可使用;使用范围很广 系统调用和库函数 系统调用:操作系统给我们提供的接口 man 2 printf 可以调用内核中的接口 直接驱动显卡运行 printf实际是库函数中的函数,然后调用系…

目标检测笔记

目标检测笔记 one-stage和two-stage目标检测算法Two-Stage 目标检测算法One-Stage 目标检测算法既然Faster R-CNN使得候选区域生成和目标检测可以在同一个网络中端到端训练,为什么它还是属于Two-stage算法? 目标检测模型,训练中的正负样本是什…

分布式技术--------------ELK大规模日志实时收集分析系统

目录 一、ELK日志分析系统 1.1ELK介绍 1.2ELK各组件介绍 1.2.1ElasticSearch 1.2.2Kiabana 1.2.3Logstash 1.2.4可以添加的其它组件 1.2.4.1Filebeat filebeat 结合logstash 带来好处 1.2.4.2缓存/消息队列(redis、kafka、RabbitMQ等) 1.2.4.…

AI PC元年,华为的一张航海图、一艘渡轮和一张船票

今天,从学术研究者到产业投资者,无不认为大模型掀起了一场人工智能的完美风暴。 所谓“完美风暴”,指的是一项新技术的各个要素,以新的方式互相影响、彼此加强,组合在一起形成了摧枯拉朽般的力量。 而我们每个人&#…

Singleton单例设计模式详解

目录 模式定义应用场景实现方式1.懒汉模式:2.饿汉模式:3.静态内部类反射如何防止反射攻击破坏? 枚举类型序列化 部分源码中的应用定位Spring & JDKTomcat反序列化指定数据源 模式定义 保证一个类只有一个实例,并且提供一个全…

jmeter使用之生成html测试报告

测试的最终结果是需要给出一份报告,那么在用jmeter测试时怎么生成一份报告呢,以下针对jmeter如何生成html报告进行简单介绍 一、首先把测试脚本写好二、利用命令生成html报告 命令:jmeter -n -t 【Jmx脚本位置】-l 【结果文件result.jtl存放…

DBSCAN简介

1. 简介 常用聚类方法有: 1. 层次的方法(hierarchical method); 2. 划分方法(partitioning method); 3. 基于密度的方法(density-based method); 4. 基于网格的方法(grid-based method); 5. 基于模型的方法(model-base…

[MAUI]集成富文本编辑器Editor.js至.NET MAUI Blazor项目

文章目录 获取资源从源码构建从CDN获取获取扩展插件 创建项目创建控件创建Blazor组件初始化保存销毁编写渲染逻辑 实现只读/编辑功能切换模式获取只读模式状态响应切换事件 实现明/暗主题切换项目地址 Editor.js 是一个基于 Web 的所见即所得富文本编辑器,它由CodeX…