【C++ | 设计模式】代理模式的详解与实现

news2024/11/13 9:36:45

1. 概念

代理模式(Proxy Pattern)是一种结构型设计模式,用于控制对对象的访问。它通过引入代理对象,间接地操作目标对象,从而实现对目标对象的控制。代理模式的核心思想是通过代理对象来控制对目标对象的访问。代理对象在目标对象之前拦截请求,可能对请求进行处理或对目标对象进行延迟加载、权限控制等操作。

2. 模式结构

UML 结构图:

4744ff68b0da4d358a7a1001ce71539c.png

  • Subject(抽象主题):声明了 RealSubject 与 Proxy 的共同接口,定义了某个/些功能。

  • RealSubject(真实主题):通常执行具体的业务逻辑,Proxy 控制对它的访问。

  • Proxy(代理):持有一个 RealSubject 引用(指针),可以在需要时将请求转发给 RealSubject,以此起到代理的作用。

  • Client(客户端):通过 Proxy 间接地与 RealSubject 进行交互。 注意: Proxy 和 RealSubject 都实现了 Subject 的接口,这允许 Client 可以像处理 RealSubject 一样处理 Proxy。

3. 优缺点

优点:

  • 控制访问:代理可以在访问目标对象之前或之后执行附加操作,如检查权限、延迟加载等。
  • 延迟初始化:通过代理实现对目标对象的延迟初始化,直到真正需要时才创建真实对象。
  • 功能扩展:在不修改目标对象的情况下,通过代理可以扩展其功能,如增加日志、缓存等。

缺点:

  • 增加复杂性:引入代理对象可能增加系统的复杂性,尤其是在代理和真实对象之间的接口较多时。
  • 性能开销:代理可能引入额外的性能开销,尤其是在执行额外操作(如权限检查、日志记录)时。

4. 适用场景

  • 延迟加载:需要延迟创建开销较大的对象时。例如,只有在实际需要时才加载图像或数据。
  • 访问控制:在访问目标对象之前需要进行权限验证或其他检查时。例如,控制对某些功能的访问权限。
  • 日志记录:记录对目标对象的访问情况时。例如,记录对某些重要对象的访问日志。
  • 缓存:在代理中缓存目标对象的结果,以避免重复计算或加载。例如,缓存数据库查询结果。

5.案例代码

中国移动 - 代理商

在现实生活中,代理无处不在 - 代购、手机代理商、火车票代售点。。。

记得刚上大学时,去学校报道,基本上都要买手机(好怀念 Nokia)、办卡、充值。学校附近的各种代理点很多:“办卡、办卡,动感地带月租只要 18 啦”、“充值、充值,充 100 送 50”。。。各种吆喝声此起彼伏 O(∩_∩)O哈哈~,由于刚开学,代理点生意十分火爆,小顾客顾不上 - 低于 50 不充。

这里,代理模式可以理解为:移动公司把充值的职责托付给代理点,代理点代替移动公司充值,客户直接与代理点打交道,而非移动公司。

#include <iostream>
using namespace std;

// Subject(接口),定义真实主题和代理都需要实现的方法
class MobileOperator {
public:
    virtual void recharge(int amount) = 0;
    virtual ~MobileOperator() {} // 虚析构函数,确保派生类的析构函数被调用
};

// RealSubject(真实主题),实现实际的充值逻辑
class ChinaMobile : public MobileOperator {
public:
    ChinaMobile() {
        cout << "中国移动:创建真实主题对象。" << endl;
    }
    
    ~ChinaMobile() {
        cout << "中国移动:销毁真实主题对象。" << endl;
    }
    
    void recharge(int amount) override {
        cout << "中国移动:充值 " << amount << " 元成功。" << endl;
    }
};

// Proxy(代理),控制对真实主题的访问
class MobileAgent : public MobileOperator {
private:
    ChinaMobile* realMobile; // 真实主题对象
public:
    MobileAgent() : realMobile(new ChinaMobile()) {
        cout << "代理商:创建代理对象。" << endl;
    }
    
    ~MobileAgent() {
        delete realMobile;
        cout << "代理商:销毁代理对象。" << endl;
    }
    
    void recharge(int amount) override {
        if (amount < 50) { // 代理商规定的最低充值金额
            cout << "代理商:充值金额低于 50 元,不接受充值。" << endl;
        } else {
            cout << "代理商:处理中..." << endl;
            realMobile->recharge(amount); // 委托真实主题处理
        }
    }
};

int main() {
    cout << "开始测试代理模式:" << endl;
    
    // 创建代理对象
    MobileAgent agent;
    
    // 测试不同充值金额的情况
    agent.recharge(30); // 应该提示金额低于 50 元
    agent.recharge(100); // 应该成功充值

    cout << "结束测试代理模式。" << endl;
    return 0;
}

 

 

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

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

相关文章

坐标系的那些事儿

哈喽&#xff0c;大家好&#xff01;地理坐标系、投影坐标系等知识是地图学、GIS和地图发布、应用等绕不开的话题&#xff0c;今天我们一起聊一聊坐标系的那些事儿&#xff01; 1.地理坐标系 为了确定地面点在地球椭球体表面位置而定义的空间参考系&#xff0c;主要用经纬度来…

软件设计师笔记-多媒体基础知识

媒体 感觉媒体&#xff08;使人产生感觉的媒体&#xff09;表示媒体&#xff08;传输感觉媒体的中介媒体&#xff09;表现媒体&#xff08;进行信息输入和输出的媒体&#xff09;存储媒体&#xff08;用于存储表示媒体的物理介质&#xff09;传输媒体&#xff08;传输表示媒体…

酿酒师的匠心独运:白酒酿造的不同工艺

在华夏大地的深处&#xff0c;一群酿酒师用他们的匠心独运&#xff0c;将大自然的馈赠转化为琼浆玉液&#xff0c;那便是豪迈白酒&#xff08;HOMANLISM&#xff09;。每一滴酒液都承载着酿酒师们的智慧和汗水&#xff0c;每一瓶豪迈白酒&#xff08;HOMANLISM&#xff09;都是…

Disjoint-set data structure--并查集

Disjoint-set data structure 不相交集, 通常称作并查集的一种数据结构。 应用范围&#xff1a;处理不相交集合的合并查询问题&#xff0c;它在处理这两种的时间复杂度在实际应用上往往认为是 O ( 1 ) O(1) O(1),稍后本篇会略加说明。接受两种操作&#xff1a;判断两元素是否…

【进程间通信】管道应用场景---简易进程池

#include<iostream> #include<vector> #include<string> #include<cstring> #include<cstdlib> #include<unistd.h> #include<sys/stat.h> #include<sys/wait.h>//把5个子进程要管理起来&#xff0c;要先描述再组织 const int…

SPI驱动学习二(驱动框架)

目录 一、回顾平台总线设备驱动模型二、SPI设备驱动1. 数据结构1.1 SPI控制器数据结构1.2 SPI设备数据结构1.3 SPI设备驱动 2. SPI驱动框架2.1 SPI控制器驱动程序2.2 SPI设备驱动程序 三、SPI设备树处理过程1. SPI Master2. SPI Device3. 设备树示例4. 设备树实例4.1 使用GPIO模…

leetcode 899. Orderly Queue

原题链接 You are given a string s and an integer k. You can choose one of the first k letters of s and append it at the end of the string. Return the lexicographically smallest string you could have after applying the mentioned step any number of moves. …

Java集合类之Collection

文章目录 1 准备部分1.1 数据结构1.1.1 数组1.1.2 链表 1.2 集合是什么 2 Collection2.1 特点2.2 常用API2.3 遍历Collection的方法2.3.1 toArray方法2.2.2 iterator方法2.3.3 foreach2.3.4 总结 3 List 接口3.1 内容提要3.2 特点3.3 List的API3.3.1 listIterator方法3.3.4 sub…

【RabbitMQ应用篇】常见应用问题

1. 消息幂等性保障 1.1 幂等性介绍 幂等性&#xff1a;这个概念在数学和计算机领域中相当常见&#xff0c;表示可以被应用多次但是不会改变初始应用结果的性质。 应用程序的幂等性&#xff1a;指的是在一个应用系统中&#xff0c;重复调用多次请求&#xff08;相同参数&#…

【Python机器学习】神经网络的组成

目录 感知机 数字感知机 认识偏置 Python版神经元 “课堂时间” 有趣的逻辑学习问题 下一步 代价函数 反向传播算法 求导 误差曲面 不同类型的误差曲面 多种梯度下降算法 Keras&#xff1a;用Python实现神经网络 展望 归一化&#xff1a;格式化输入 神经网络对…

C语言 面向对象编程

注意事项 在使用面向对象编程的时候&#xff0c;我们得问自己&#xff1a;任务中有什么对象&#xff0c;对象应该怎么使用 项目中文档体系 我们可以规划一下任务得文档&#xff0c;可以为每一个对象的类单独编写源码&#xff0c;并发布对应的头文件作为接口&#xff0c;主控…

Android CCodec Codec2 (六)C2InterfaceHelper

通过前面几篇文章的学习&#xff0c;我们知道了Codec2参数结构&#xff0c;以及如何定义一个Codec2参数。接下来的几篇文章我们将简单了解上层是如何请求组件支持的参数、如何配置参数&#xff0c;以及参数是如何反射给上层的。本篇文章我们将了解接口参数实例化。 1、C2Interf…

Linux零基础到精通(二)-vmware虚拟机使用教程及Centos7操作系统安装

目录 前言Linux 操作系统运用领域vmware虚拟机安装与使用电脑硬件环境要求vmware虚拟机软件安装创建一个虚拟机配置vmware的虚拟化网络 通过vmware虚拟机安装操作系统下载Centos7系统镜像安装Centos7操作系统配置网络和主机名称信息配置系统分区软件包选择设置用户密码进入Cent…

入门Java编程的知识点—>静态方法(day11)

重点掌握final关键字特点&#xff1f;final的语法使用?重点掌握静态变量是什么&#xff1f;静态变量的语法与使用?了解方法区内存图执行过程?重点掌握静态方法是什么&#xff1f;静态方法的语法特点与使用?重点掌握常量语法如何定义与使用? final(最终) final可以用于修…

IT运维问题深度剖析与一体化解决方案探索

在当今信息化高速发展的时代&#xff0c;IT运维作为保障企业业务连续性和稳定性的关键环节&#xff0c;其重要性日益凸显。然而&#xff0c;随着企业规模的扩大和业务的复杂化&#xff0c;IT运维面临着诸多挑战和问题。本文旨在深度剖析当前IT运维中的紧迫性问题与需求&#xf…

C++学习, 指针的指针

指针的指针&#xff1a; 是一种间接寻址的形式&#xff0c;指针的指针就是将指针的地址存放在另一个指针里面。一般&#xff0c;指针包含一个变量的地址&#xff0c;当定义一个指向指针的指针时&#xff0c;第一个指针包含了第二个指针的地址&#xff0c;第二个指针指向实际值…

day35-测试之性能测试JMeter的测试报告、并发数计算和性能监控

目录 一、JMeter的测试报告 1.1.聚合报告 1.2.html报告 二、JMeter的并发数计算 2.1.性能测试时的TPS&#xff0c;大都是根据用户真实的业务数据&#xff08;运营数据&#xff09;来计算的 2.2.运营数据 2.3.普通计算方法 2.4.二八原则计算方法 2.5.计算稳定性测试并发量 2.6…

Java性能优化传奇之旅--Java万亿级性能优化之Java 性能优化传奇:热门技术点亮高效之路

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的博客,正是这样一个温暖美好的所在。在这里,你们不仅能够收获既富有趣味又极为实…

MOELoRA —— 多任务医学应用中的参数高效微调方法

人工智能咨询培训老师叶梓 转载标明出处 在医疗场景中&#xff0c;LLMs可以应用于多种不同的任务&#xff0c;如医生推荐、诊断预测、药物推荐、医学实体识别、临床报告生成等。这些任务的输入和输出差异很大&#xff0c;给统一模型的微调带来了挑战。而且LLMs的参数众多&…

Nginx 维护与应用:最佳实践

文章目录 引言安装与基础维护macOS 上安装 NginxUbuntu 上安装 NginxCentOS 上安装 NginxWindows 上安装 Nginx查看 Nginx 运行状态与日志信息&#xff08;Linux&#xff09;版本升级与配置备份&#xff08;Linux&#xff09; Nginx 应用场景Web 服务器反向代理动静分离负载均衡…