设计模式-04 设计模式-Proxy Pattern 代理模式

设计模式-04 设计模式-Proxy Pattern 代理模式
 

1.定义

代理模式 为一个对象提供一个代理或占位符,以便控制对该对象的访问和操作。代理可以拦截并修改对目标对象的调用,从而实现以下目的:

控制访问:限制对敏感或昂贵对象的访问,只允许经过身份验证或授权的用户访问。
延迟实例化:推迟创建昂贵或耗时的对象,直到真正需要时才创建。
提供额外的功能(日志记录,监控):在不修改目标对象的情况下,向目标对象添加额外的功能,例如日志记录、缓存或安全检查。
缓存功能:对于昂贵的对象,可以减少重复创建,减少调用真实对象的次数

       


          +--------------+
          |              |
          |   Interface  |
          |              |
          +--------------+
                 |
                 v
          +--------------+            +--------------+
          |   Proxy       |  ----|>   |   Concrete   |
          |   Object      |           |  Object      |
          +--------------+            +--------------+
2.内涵

代理模式 结构,代理模式包含以下角色:

  • Subject(目标):被代理的真实对象。
  • Proxy(代理):提供对目标对象的代理或占位符。
  • Client(客户端):使用代理来访问目标对象。

常用例子:

一个代理模式的例子是远程代理,它可以代表远程服务器上的对象。远程代理拦截对本地对象的调用,并将其转发到远程服务器上的实际对象。这允许客户端与远程对象交互,而无需直接访问远程服务器。

此外开源软件里面用的此模式的场景:

  • Mockito:使用代理模式创建模拟对象,用于单元测试。
  • Javassist:使用代理模式动态生成字节码,用于增强和修改现有类。
  • ASM:使用代理模式在字节码级别增强和修改类。
3.案例

一个简单使用 代理模式的c++ demo 

#include <iostream>
 
using namespace std;
 
class Image {
public:
    virtual void display() = 0;
};
 
class RealImage : public Image {
private:
    std::string filename;
 
public:
    RealImage(const std::string& filename) : filename(filename) {
        std::cout << "加载 image: " << filename << std::endl;
    }
 
    void display() override {
        std::cout << "显示 image: " << filename << std::endl;
    }
};


class ImageProxy : public Image {
private:
    RealImage* realImage;
    std::string filename;
 
public:
    ImageProxy(const std::string& filename) : filename(filename), realImage(nullptr) {}
 
    void display() override {
        if (nullptr == realImage) {
            realImage = new RealImage(filename);  // 如果有加载这次就不加载
        }
        realImage->display();
    }
};
 
 
int main() {
    Image* image = new ImageProxy("example.jpg");
    image->display(); // 具有缓存功能
    image->display();
    delete image; // Clean up
    return 0;
}
4.最佳实践


代理模式最佳实践:

明确代理目的:清楚地定义代理的职责和它要解决的问题。
将代理与目标对象解耦:代理不应该直接依赖于目标对象的具体实现。使用抽象接口或基类来表示目标对象,以便代理可以与不同的目标对象一起使用。
保持代理与目标对象同步:如果目标对象的状态发生变化,代理也应该相应地更新。
避免代理循环:确保代理不会直接或间接地引用自身,否则会导致无限循环。
使用虚拟代理来延迟实例化:只在需要时才创建目标对象,以提高性能。
考虑使用 AOP(面向方面编程):AOP 框架可以简化代理的创建和管理,尤其是在需要向多个对象添加类似功能的情况下。
谨慎使用代理:过度使用代理可能会降低性能并增加代码复杂性。只在真正需要的时候使用代理。
测试代理:编写测试以验证代理的正确行为,包括边界条件和异常情况。

此外以下也需要重点关注:

使用设计模式来增强代理:例如,可以使用工厂模式来创建代理,或者使用单例模式来确保只有一个代理实例。
考虑使用库或框架来实现代理:有许多库和框架(如 Spring AOP)提供开箱即用的代理实现。
记录代理的用途和限制:在代码中清楚地记录为什么使用代理以及代理的限制。


5.总结

代理模式在 C++中的应用是一种有价值的工具,可以增强应用程序的控制力和效率。通过使用代理,可以实现延迟初始化、访问控制、日志记录和缓存,从而提高代码的性能和可维护性。它允许你在不改变类结构的情况下为类添加额外的功能层。在恰当应用时,代理模式可以成为你设计模式工具箱中的一个强有力武器。

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

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

相关文章

服务攻防-数据库安全RedisCouchDBH2database未授权访问CVE漏洞

#知识点&#xff1a; 1、数据库-Redis-未授权RCE&CVE 2、数据库-Couchdb-未授权RCE&CVE 3、数据库-H2database-未授权RCE&CVE#章节点&#xff1a; 1、目标判断-端口扫描&组合判断&信息来源 2、安全问题-配置不当&CVE漏洞&弱口令爆破 3、复现对象-数…

Chat2DB Pro 重磅发布 !!!

在过去的几个月中&#xff0c;我们的团队一直默默耕耘&#xff0c;全心投入到Chat2DB Pro版本的开发之中。这段时间里&#xff0c;我们暂停了新动态的发布&#xff0c;以至于有趣的误解在社群中出现&#xff0c;有人调侃我们是否“倒闭”了。然而&#xff0c;我们今天携带着全新…

C++ | Leetcode C++题解之第71题简化路径

题目&#xff1a; 题解&#xff1a; class Solution { public:string simplifyPath(string path) {auto split [](const string& s, char delim) -> vector<string> {vector<string> ans;string cur;for (char ch: s) {if (ch delim) {ans.push_back(mov…

Docker——consul的容器服务更新与发现

一、什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff0c;起初的解决手段…

密码学《图解密码技术》 记录学习 第十五章

目录 十五章 15.1本章学习的内容 15.2 密码技术小结 15.2.1 密码学家的工具箱 15.2.2 密码与认证 15.2.3 密码技术的框架化 15.2.4 密码技术与压缩技术 15.3 虚拟货币——比特币 15.3.1 什么是比特币 15.3.2 P2P 网络 15.3.3地址 15.3.4 钱包 15.3.5 区块链 15.3.…

力扣每日一题114:二叉树展开为链表

题目 中等 提示 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

JavaScript基础(五)

三目运算符 用于判断并赋值 语法: 判断条件?条件成立执行语句:条件不成立执行语句; (条件&#xff1f;"true":"false";) 例: <script> var age prompt(请输入年龄) var name (age>18)?"已成年":"未成年禁止登录" a…

Spring与AI结合-spring boot3整合AI组件

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 spring ai简介 单独整合al接口 整合Spring AI组件 起步条件 ​编辑 进行必要配置 写在最后 写在前面 本文介绍了springboot开发后端服务中&#xff0c;AI组件(Spring A…

笔试强训Day15 二分 图论

平方数 题目链接&#xff1a;平方数 (nowcoder.com) 思路&#xff1a;水题直接过。 AC code&#xff1a; #include<iostream> #include<cmath> using namespace std; int main() {long long int n; cin >> n;long long int a sqrtl(n);long long int b …

【1】STM32·FreeRTOS·新建工程模板【一步到位】

目录 一、获取FreeRTOS源码 二、FreeRTOS源码简介 2.1、FreeRTOS源码文件内容 2.2、FreeRTOS内核 2.3、Source文件夹 2.4、portable文件夹 三、FreeRTOS手把手移植 3.1、FreeRTOS移植准备 3.2、FreeRTOS移植步骤 3.2.1、将 FreeRTOS 源码添加至基础工程、头文件路径等…

LLaMA 羊驼系大语言模型的前世今生

关于 LLaMA LLaMA是由Meta AI发布的大语言系列模型&#xff0c;完整的名字是Large Language Model Meta AI&#xff0c;直译&#xff1a;大语言模型元AI。Llama这个单词本身是指美洲大羊驼&#xff0c;所以社区也将这个系列的模型昵称为羊驼系模型。 Llama、Llama2 和 Llama3…

修改idea缓存的默认存储位置

打开idea.properties 找到 # idea.config.path${user.home}/.IntelliJIdea/config # idea.system.path${user.home}/.IntelliJIdea/system 将${user.home}替换成你要存储到的路径 再次打开idea时会弹出消息&#xff0c;点击ok即可。

电脑c盘太满了,如何清理 电脑杀毒软件哪个好用又干净免费 电脑预防病毒的软件 cleanmymacX有必要买吗 杀毒软件排行榜第一名

杀毒软件通常集成监控识别、病毒扫描和清除、自动升级、主动防御等功能&#xff0c;有的杀毒软件还带有数据恢复、防范黑客入侵、网络流量控制等功能&#xff0c;是计算机防御系统的重要组成部分。 那么&#xff0c;对于Mac电脑用户来说&#xff0c;哪款电脑杀毒软件更好呢&a…

虚幻引擎5 Gameplay框架(二)

Gameplay重要类及重要功能使用方法&#xff08;一&#xff09; 配置LOG类及PlayerController的网络机制 探索验证GamePlay重要函数、类的执行顺序与含义 我们定义自己的日志&#xff0c;专门建立一个存放自己日志的类&#xff0c;这个类继承自BlueprintFunctionLibrary 然后…

Prometheus 2: 一个专门评估其他语言模型的开源语言模型(续集)

普罗米修斯的续集来了。 专有的语言模型如 GPT-4 经常被用来评估来自各种语言模型的回应品质。然而,透明度、可控制性和可负担性等考虑强烈促使开发专门用于评估的开源语言模型。另一方面,现有的开源评估语言模型表现出关键的缺点:1) 它们给出的分数与人类给出的分数存在显著差…

[Android]四大组件简介

在 Android 开发中&#xff0c;“四大组件”&#xff08;Four Major Components&#xff09;是指构成 Android 应用程序的四种核心组件&#xff0c;它们通过各自的方式与系统交互&#xff0c;实现应用的多样功能。这些组件是&#xff1a;Activity、Service、Broadcast Receiver…

用 node 写一个命令行工具,全局安装可用

现在&#xff0c;不管是前端项目还是 node 项目&#xff0c;一般都会用 npm 做包管理工具&#xff0c;而 package.json 是其相关的配置信息。 对 node 项目而言&#xff0c;模块导出入口文件由 package.json 的 main 字段指定&#xff0c;而如果是要安装到命令行的工具&#x…

28 - 算术运算指令

---- 整理自B站UP主 踌躇月光 的视频 文章目录 1. ALU改进2. CPU 整体电路3. 程序4. 实验结果 1. ALU改进 此前的 ALU&#xff1a; 改进后的 ALU&#xff1a; 2. CPU 整体电路 3. 程序 # pin.pyMSR 1 MAR 2 MDR 3 RAM 4 IR 5 DST 6 SRC 7 A 8 B 9 C 10 D 11 DI 1…

在.NET架构的Winform项目中引入“异步编程”思想和技术

在.NET架构的Winform项目中引入“异步编程”思想和技术 一、异步编程引入&#xff08;1&#xff09;异步编程引入背景&#xff08;2&#xff09;异步编程程序控制流图&#xff08;3&#xff09;异步编程前置知识&#xff1a; 二、异步编程demo步骤1&#xff1a;步骤2&#xff1…

政安晨:【Keras机器学习示例演绎】(三十八)—— 从零开始的文本分类

目录 简介 设置 加载数据IMDB 电影评论情感分类 准备数据 数据矢量化的两种选择 建立模型 训练模型 在测试集上评估模型 制作端到端模型 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨…
最新文章