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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot实现工程教育认证的计算机课程管理平台项目【项目源码+论文说明】

基于springboot实现计算机课程管理平台系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管理平台管理的不足…

Liunx挂载硬件设备

一、mount命令(用于挂载文件系统) (一)语法格式:mount 参数 源设备路径 目的路径 (二)参数 1、-t:指定挂载的文件系统 (1)iso9660:光盘或光盘…

uniapp H5项目 获取接口的二进制流转化成图片url(base64)

如果你使用的是uniapp, 并且你从接口获取下来的数据长这样: 想要把取到的数据展示成图片,那么你可以这样做: // 这是我们的项目封装的请求方法const res await this.$api.getKaptcha({originResponse: true, // 这样写是为了在request那边特…

输电线路运行特性及简单电力系统潮流估算(三)

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第三篇笔记。上一篇传送门。 辐射型网络和简单闭式网络的潮流估算方法 辐射型网络的潮流估算方法 指的是在网络中不含环形电路,为开式网络,而且全部负荷都只能用一个电源来供电的网络。 …

logistic分叉图

MATLAB代码 % 初始化 r_min 2.5; % 参数r的起始值 r_max 4.0; % 参数r的结束值 r_step 0.001; % 参数r的步长 r_values r_min:r_step:r_max; % 参数r的范围% 分岔图数据初始化 num_iterations 1000; % 总迭代次数 num_last_points 100; % 用于绘图的最后的这些…

idea2024.1发布,lambda多语句的内联断点,增强spring图标等新特性,你没玩过的全新版本

这里是weihubeats,觉得文章不错可以关注公众号小奏技术 简述 2024-04-04 idea官方宣布发布了 一些重大更新 随后我便下载了你没玩过的全新版本IntelliJ IDEA Ultimeate版本试玩 然后脑子里面想到这个 开玩笑 实际下载完是这样 更新内容 更新的内容比较多 关键亮点主要有如下…

VUE 使用 Vite 创建一个 vue3.0 + vite 项目

Vite 是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成: 1. 一个开发服务器,它基于 原生 ES 模块 提供了 丰富的内建功能,如速度快到惊人的 模块热更新(HMR)。 2. 一套构建指令&#…

每日算法练习(1)

开一个新坑,记录下自己每天的算法练习,希望自己通过1个多月的学习,能够成为算法大神。 下面正式开始新坑。 两个数组的交集 这是牛客上的题,根据题意,我们有多种解法,这题用哈希比较好写。我们可以弄一个…

智慧公厕解决方案易集成好使用的智能硬件

在现代城市建设中,智慧公厕的需求日益增长。为了提供更好的用户体验和更高效的管理,易集成、好使用的智能硬件成为智慧公厕解决方案的关键组成部分。 1. 蹲位有人无人感应器:是用于检测厕位有人无人的设备,根据现场不同的安装条件…

【管理咨询宝藏78】MBB大型城投集团核心能力建设分析报告

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏78】MBB大型城投集团核心能力建设分析报告 【格式】PDF版本 【关键词】战略规划、商业分析、管理咨询、MBB顶级咨询公司 【强烈推荐】 这是一套…

Java中的栈和队列

1.前言 在计算机科学中,数据结构是用来组织和存储数据的方式,以便可以高效地访问和修改。栈和队列是两种最基本的数据结构,它们在各种计算过程中都有广泛的应用。本文将介绍栈和队列的概念、特性以及它们的一些常见应用。 2.栈 2.1概念 栈…

Vue实现多角色登录,Vue-Router路由守卫控制权限页面

实现页面侧边栏和头部不变,当点击某个功能时,只有主体部分发生变化,这要用到子路由技术 我的项目结构如上,其中包含侧边栏和头部的文件是Manage.vue,主页面是Home.vue,个人页面是Person.vue,用户…

kaggle咖啡销售分析案例侧重可视化折线图条形图扇形图柱状图

目录 概述 环境依赖 数据描述 代码概述 导包 数据读取 统计缺失值 数据结构概述 描述统计 时间轴数据转换 月交易统计直方图 周交易统计图 小时数据转换 小时折线图 销售关系可视化统计 销售占比扇形图 价格箱线图 各类别多维度条形图统计 商店位置交易量折线…

9个技巧使你的Python代码更Pythonic!

如何区分漂亮和丑陋的代码? 更重要的是,如何写出漂亮的 Python 代码? 本文将通过初学者容易理解的例子展示9个神话般的Python技巧,以帮助你在日常工作中编写更多的Pythonic程序。 01 product() 使用 product() 函数避免嵌套的…

电缆故障测试仪的操作方法有哪些?

电缆故障测试仪是一种专业设备,用于检测电力电缆和通信电缆的各种故障。它采用多种技术手段,包括但不限于低压脉冲法、高压闪络法、直闪法和冲闪法。这些方法适用于不同类型的电缆故障,例如断线、接触不良、低阻接地、高阻接地、开路故障和短…

iOS开发 刻度盘 仪表盘,圆点按钮滑动控制,渐变色

最近项目需要,想做一个渐变色的刻度盘,圆形按钮滑动控制,所以 用oc写了一下,代码没附上,想看代码可以私信联系,效果如下图。 部分代码 self.drawCenter CGPointMake(self.frame.size.width / 2.0, self.f…

ubuntu22.04搭建dns内网

近期,需要在无网络的ubuntu环境下搭建内部可用的dns内网,总共花费3个工作日晚上,总算成功搭建,做个记录,记录踩坑记录,同时方便以后翻阅。 安装软件包: 有网络环境下,比较简单&…

科研基础与工具(论文搜索)

免责申明: 本文内容只是学习笔记,不代表个人观点,希望各位看官自行甄别 参考文献 科研基础与工具(YouTube) 搜索论文 Google Scholar 谷歌学术 涵盖面太全了,都收录,就会有很多低质量的论文…

基于STM32F103RCT6最小系统原理图和PCB

目录 1、原理图 2、PCB 3、3D图 资料下载地址:基于STM32F103RCT6最小系统原理图和PCB 1、原理图 2、PCB 3、3D图

解决Error in writing header file of the driver

在源代码里面更新了一批常规的内容,编译的时候遇到一个error,一大片都是红的。XXX是项目名称。 Description Resource Path Location Type Generator: ERROR: Error in writing header file of the driver XXX Cpu Processor Expert Problem 表面意思是…