设计模式之代理模式(C++)
作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、代理模式是什么?
代理模式是一种结构型的软件设计模式,在不改变原代码前提下,提供一个代理,以控制对原对象的访问。
代理模式的优点:
- 职责清晰。真实对象专注于自身业务逻辑,不用考虑其他非本职内容,交给代理完成。
- 高拓展性。真实对象的改变不影响代理。
- 解耦。将客户端与真实对象分离,降低系统耦合度。
- 提高性能。虚拟代理可以减少系统资源的消耗。
- 高安全性和稳定性。代理能很好地控制访问,提高程序安全。
代理模式的缺点:
- 增加系统复杂度。代理的职责往往较冗杂。
- 请求速度降低。客户端与真实对象中加入代理,一定程度上会降低整个系统流程的运行效率。
二、代理模式
2.1 结构图
客户端即Main主函数,本文示例中代理添加了额外功能-充值,因此客户端直接调用代理。

2.2 代码示例
场景描述:游戏往往有自己的代理商,想要玩魔兽,需要和其代理进行沟通,在进行充值后,正常游戏。
//Game.h
/****************************************************/
#pragma once
#include <iostream>using namespace std;#include <iostream>
using namespace std;// 抽象游戏类
class Game
{
public:// 游戏加载virtual void load() = 0;// 游戏退出virtual void exit() = 0;
};// 真实游戏类-魔兽世界
class WOW : public Game
{
public:// 游戏加载virtual void load() {cout << "魔兽世界加载。" << endl;}// 游戏退出virtual void exit() {cout << "魔兽世界退出。" << endl;}
};// 代理类-魔兽代理
class ProxyWOW : public Game
{
public:// 构造函数ProxyWOW() {m_wow = new WOW();}// 析构函数virtual ~ProxyWOW() {if (m_wow != nullptr) {delete m_wow;m_wow = nullptr;}}// 充值时间void recharge(int money) {m_time += money / 100;cout << "充值:" << money << endl;cout << "获得时长:" << m_time << endl;}// 游戏加载virtual void load() {cout << "代理启动。" << endl;if (m_time > 0) {m_wow->load();cout << "游戏时长1小时。" << endl;m_time -= 1;cout << "剩余时长:" << m_time << endl;flag = true;}else {cout << "剩余游戏时长不足,请充值。" << endl;flag = false;}}// 游戏退出virtual void exit() {if (flag) {m_wow->exit();flag = false;}cout << "代理关闭。" << endl;}private:bool flag = false;int m_time = 0;WOW* m_wow;
};
//main.cpp
/****************************************************/
#include <iostream>
#include <string>
#include "Subject.h"using namespace std;int main()
{// 玩魔兽ProxyWOW* proxy = new ProxyWOW();// 加载proxy->load();// 充值proxy->recharge(1000);// 加载proxy->load();// 退出proxy->exit();// 清理内存delete proxy;proxy = nullptr;return 0;}
程序结果如下。

本文提供的示例是游戏方面的,玩大型网络游戏往往都要通过代理的平台,所以我模拟了一个简易的充值和游戏流程。代理在生活中随处可见,各种中介服务就是代理的一种;在网络应用中代理也很常见,如服务器代理等等。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对代理模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解代理模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!
相关文章:
设计模式之代理模式(C++)
作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、代理模式是什么? 代理模式是一种结构型的软件设计模式,在不改变原代码前提下,提供一个代理…...
c++11 标准模板(STL)(std::unordered_multimap)(三)
定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…...
Linux进程控制-2
紧接着上篇博客出发,我们接着来讲述Linux中进程控制的内容。 目录 1.等待 1.1具体操作 1.等待 进程等待主要的作用在于:父进程创建子进程之后,等待子进程退出,获取子进程的退出码,释放子进程的资源,避…...
快速排序算法
一:快速排序思想 假设我们现在对“6 1 2 7 9 3 4 5 10 8”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥的了)。为了方便ÿ…...
中华好诗词大学季第二季(四)
第七期 1,二十四友一朝尽,爱妾坠楼何足言出自许浑的《金谷园》,“爱妾”指的是谁 2,李白在《九月十日即事》借菊花表达自己的惋惜之情,请问九月十日是什么节日 A 后登高 B 菊花节 C 小重阳 3,贾宝玉在大观园里面题了“曲径通幽”…...
分布式系统容灾部署方案
本文主要以OceanBase部署来说明分布式系统容灾部署方案 分布式系统提供持续可用的服务尤为重要。 好的分布式系统根据需求提供不同等级的的高可用与容灾级别。 而在分布式系统中,数据库系统又是最核心最关键的系统。 我们以数据库分布式系统为主,考虑…...
Python 爬虫性能相关总结
这里我们通过请求网页例子来一步步理解爬虫性能 当我们有一个列表存放了一些url需要我们获取相关数据,我们首先想到的是循环 简单的循环串行 这一种方法相对来说是最慢的,因为一个一个循环,耗时是最长的,是所有的时间总和 代码…...
Baumer工业相机堡盟工业相机如何设置网口的IP地址(工业相机连接的网口设置IP地址步骤)
Baumer工业相机堡盟工业相机如何设置网口的IP地址(工业相机连接的网口设置IP地址步骤)Baumer工业相机Baumer工业相机设置网络端口IP地址匹配设置网络端口IP地址和工业相机IP地址匹配第一次打开CameraExplorer软件确认问题为IP地址不匹配问题打开网络连接…...
Android MediaCodec设置H264 Profile到High
H264 High Profile压缩率高,能降低码率,这里记录下MediaCodec Profile设置到High遇到的一些问题。 Android 4.1 就引入了MediaCodecInfo.CodecProfileLevel类,下面截取H264(AVC)的Profile和Level定义: /** Copyright (C) 2012 The Android O…...
QT之QSysInfo(查看电脑信息)
文章目录前言一、API使用总结前言 QSysInfo是Qt中用于获取有关运行应用程序的系统信息的类。 我们可以获取以下信息: 返回系统产品类型,如ios,windows,Linux等 返回当前系统的产品版本。 返回当前系统的内核类型。 返回当前系统的…...
中国塑料编织袋产业竞争状况及投资前景预测报告2023-2029年
中国塑料编织袋产业竞争状况及投资前景预测报告2023-2029年 KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 《报告编号》: BG451639 《出版时间》: 2023年4月 《出版机构》: 中智正业研究院 免费售后 服务一年,具体内容及订购流程欢迎咨询客服人员 内容简介&…...
从头用脚分析FFmpeg源码 - av_read_frame
av_read_frame作用 /*** Return the next frame of a stream.* This function returns what is stored in the file, and does not validate* that what is there are valid frames for the decoder. It will split what is* stored in the file into frames and return one f…...
第17章_触发器
第17章_触发器 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公…...
3956. 截断数组
3956. 截断数组 - AcWing题库 3956. 截断数组 【题目描述】 给定一个长度为 nn 的数组 a1,a2,…,ana1,a2,…,an。 现在,要将该数组从中间截断,得到三个非空子数组。 要求,三个子数组内各元素之和都相等。 请问,共有多少种不同…...
React Labs: 我们最近在做什么——2023 年 3 月
原文:https://react.dev/blog/2023/03/22/react-labs-what-we-have-been-working-on-march-2023 React Server Components React Server Components(下文简称 RSC) 是由 React 团队设计的新应用程序架构。 我们首先在一个介绍性演讲和一个RFC中分享了我们对 RSC 的…...
文件系统设计详解
抽象的文件系统以目录的形式来组织文件,我们可以利用该文件系统来读取某个文件的内容,也可以对目录或者文件实施监控并及时获取变化的通知。 IChangeToken IChangeToken对象就是一个与某组监控数据相关联的“令牌”(Token)&#x…...
好看~立马启动python实现美女通通下
人生苦短,我用python一、环境版本使用二、代码实现思路三、代码展示:导入模块伪装(请求头)四、部分好看截图,更多的就自己去采集噜~吃饭放松的时候哇一不小心看见了很多好看的东西 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 独乐乐不如众乐乐…...
Git 安装设置
1、安装 安装以下三个软件: Git-2.13.3-64-bit.exe TortoiseGit-2.4.0.2-64bit.msi TortoiseGit-LanguagePack-2.4.0.0-64bit-zh_CN.msi 安装过程中不用填写、不用选择,全部点"下一步",完成后需要重启机器。 2、基本设…...
Python-闭包
介绍 Python的闭包是一种高级的编程技巧,它可以在函数内部定义另一个函数,并返回该函数的引用。这个内部函数可以访问外部函数的变量和参数,即使外部函数已经执行完毕 好处 1)闭包可以避免全局变量的污染,使得代码更…...
Gitlab中Pipeline语法四
Gitlab中Pipeline语法 cache cache:paths 在job build中定义缓存,将会缓存target目录下的所有*.jar文件当全局定义了cache:paths会被job中覆盖.以下实例将缓存target目录 buld:script: buildcache:paths:- target/*.jar#设置key可以解决cache被覆盖 cache:paths:- my/files…...
Ray Optics:面向未来的光学仿真平台——从零开始的光学建模实践
Ray Optics:面向未来的光学仿真平台——从零开始的光学建模实践 【免费下载链接】ray-optics A web app for creating and simulating 2D geometric optical scenes, with a gallery of (interactive) demos. 项目地址: https://gitcode.com/gh_mirrors/ra/ray-op…...
OpenRocket终极指南:专业火箭设计与飞行仿真软件完全解析
OpenRocket终极指南:专业火箭设计与飞行仿真软件完全解析 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket OpenRocket是一款功能强大的开源火箭…...
ShardingSphere-Proxy 5.2 容器化部署与开发调试实战指南
1. 为什么选择ShardingSphere-Proxy 5.2作为开发调试工具 在分库分表场景下开发应用时,最让人头疼的就是数据查询和调试问题。想象一下,你的订单数据被分散在4个库的8张表中,每次测试时想确认数据是否正确写入,都得手动连接不同数…...
提升物业服务满意度的物业管理小程序
一、首页核心服务入口基础功能模块:物业缴费、我的房产、通知公告、投诉建议、维修申报、小区活动、家政服务、优惠好物,覆盖业主日常高频需求信息与活动展示:顶部搜索栏:支持关键词检索,快速定位所需服务物业公告&…...
基于高斯过程回归的MATLAB时间序列区间预测代码实现与解析
基于高斯过程回归(GPR)的时间序列区间预测 GPR时间序列区间预测 matlab代码 暂无Matlab版本要求 -- 推荐 2018B 版本及以上做时间序列最烦的就是拍脑袋给个“明天涨3%左右”——“左右”到底是正负0.5还是正负3?如果是风电发电的负荷申报,正负差多了要罚…...
【HALCON实战】set_window_param:解锁图形窗口高级定制与性能调优
1. 为什么你需要掌握set_window_param? 在机器视觉项目开发中,图形窗口就像工程师的眼睛。我见过太多同行把90%的精力花在算法优化上,却忽视了窗口显示这个"最后一公里"问题。直到某次在客户现场演示时,程序因为频繁刷新…...
胡桃工具箱:免费开源的原神桌面助手如何提升你的游戏体验
胡桃工具箱:免费开源的原神桌面助手如何提升你的游戏体验 【免费下载链接】Snap.Hutao 实用的开源多功能原神工具箱 🧰 / Multifunctional Open-Source Genshin Impact Toolkit 🧰 项目地址: https://gitcode.com/GitHub_Trending/sn/Snap.…...
新手零失败指南:利用快马ai轻松完成openclaw的ubuntu环境搭建
最近在学习机器人抓取相关的技术,发现OpenClaw是一个很不错的开源项目。但作为一个Ubuntu新手,在部署过程中遇到了不少坑。经过一番摸索,终于总结出了一套适合新手的零失败部署方案,今天就和大家分享一下。 准备工作 首先确保你的…...
“人工智能+”政策下,企业AI转型的机遇与路径
在“人工智能”政策的大力推动下,企业引入AI项目与产品正成为提升竞争力、实现转型提效的关键举措。对于山东地区,尤其是威海地区的企业而言,把握这一趋势,积极探索AI技术的应用,无疑是顺应时代发展的明智选择。企业引…...
基于STM32F103主控与BMP085气压计、HMC5883L磁力计的九轴DMP解算与卡尔曼...
九轴解算航向角、俯仰角、滚转角输出f103主控,气压计bmp085,磁力计hmc5883l,dmp解算,卡尔曼滤波矩阵运算,多份代码前阵子蹲在宿舍焊飞控的时候,突然发现之前抄的九轴解算代码总飘,哪怕把飞控放在…...
