《C++新经典设计模式》之第14章 代理模式

《C++新经典设计模式》之第14章 代理模式

        • 代理模式.cpp

代理模式.cpp
#include <iostream>
#include <memory>
#include <vector>
#include <string>
#include <fstream>
using namespace std;// 客户端和访问对象间引入代理对象(间接层),中介或桥梁
// 增加额外功能、约束或屏蔽复杂细节
// 为其他对象提供一种代理,以控制对这个对象的访问
// 3种角色
// Subject(抽象主题),定义接口
// Proxy(代理主题),内部包含真实主题的引用
// RealSubject(真实主题),代理主题所代表的真实主题// 远程代理
// 虚拟代理
// 保护代理
// 缓存/缓冲代理
// 智能引用代理
// 写时复制优化代理namespace ns1
{class WebAddr{public:virtual ~WebAddr() {}virtual void visit() = 0; // 访问网站};class WebAddr_Shopping : public WebAddr // 某购物网站{public: // 访问该购物网站,可能涉及到复杂的网络通信void visit() override { cout << "visit WebAddr_Shopping!" << endl; }};class WebAddr_Video : public WebAddr // 某视频网站{public: // 访问该视频网站,可能涉及到复杂的网络通信void visit() override { cout << "visit WebAddr_Video!" << endl; }};class WebAddrProxy : public WebAddr // 网站代理类{shared_ptr<WebAddr> mp_webaddr; // 代表要访问的具体网站public:                             // 引入的目的是传递进来要访问的具体网站WebAddrProxy(const shared_ptr<WebAddr> &pwebaddr) : mp_webaddr(pwebaddr) {}public:void visit() override{// 在这里进行访问的合法性检查、日志记录或者流量限制......if (mp_webaddr != nullptr)mp_webaddr->visit();// 在这里可以进行针对返回数据的过滤......}};class WebAddr_Shopping_Proxy : public WebAddr // 专门针对某购物网站WebAddr_Shopping的代理{public:void visit() override{// 在这里进行访问的合法性检查、日志记录或者流量限制......shared_ptr<WebAddr> p_webaddr(new WebAddr_Shopping());p_webaddr->visit();// 在这里可以进行针对返回数据的过滤......}};
}namespace ns2
{static vector<string> g_fileItemList;class ReadInfo // 抽象主题{public:virtual ~ReadInfo() {}virtual void read() = 0;};class ReadInfoFromFile : public ReadInfo // 真实主题{public:void read() override{ifstream fin(".vscode/settings.json"); // 文件中读取信息if (!fin){cout << "failure" << endl;return;}g_fileItemList.clear();string linebuf;while (getline(fin, linebuf)) // 系统函数,从文件中逐行读入内容{if (!linebuf.empty())                  // 读入的不是空行g_fileItemList.push_back(linebuf); // 将文件中的每一行都保存到vector容器中}fin.close(); // 关闭文件输入流}};class ReadInfoProxy : public ReadInfo // 代理主题{bool m_loaded = false; // false表示还没有从文件中读出数据到内存public:void read() override{if (!m_loaded){// 没有从文件中载入信息,则载入m_loaded = true; // 标记信息已经从文件中被载入进来,这样下次再获取这些数据时就不需要再去读文件了shared_ptr<ReadInfo> rf(new ReadInfoFromFile());rf->read(); // 将文件中的数据读入全局容器g_fileItemList中cout << "read from file: " << endl;}else{cout << "read from cache: " << endl;}// 现在数据一定在g_fileItemList中,开始显示for (auto iter = g_fileItemList.cbegin(); iter != g_fileItemList.cend(); ++iter)cout << *iter << endl;}};
}int main()
{
#if 0using namespace ns1;shared_ptr<WebAddr> wba1(new WebAddr_Shopping());wba1->visit(); // 访问该购物网站shared_ptr<WebAddr> wba2(new WebAddr_Video());wba2->visit(); // 访问该视频网站
#endif#if 0using namespace ns1;shared_ptr<WebAddr> wba1(new WebAddr_Shopping());shared_ptr<WebAddr> wbaproxy1(new WebAddrProxy(wba1));wbaproxy1->visit(); // 通过代理去访问WebAddr_Shopping购物网站shared_ptr<WebAddr> wba2(new WebAddr_Video());shared_ptr<WebAddr> wbaproxy2(new WebAddrProxy(wba2));wbaproxy2->visit(); // 通过代理去访问WebAddr_Video视频网站
#endif#if 0using namespace ns1;shared_ptr<WebAddr> wbasproxy(new WebAddr_Shopping_Proxy());wbasproxy->visit(); // 访问的实际是某购物网站
#endif#if 1using namespace ns2;shared_ptr<ReadInfo> preadinfoproxy(new ReadInfoProxy());preadinfoproxy->read(); // 第一次调用read是借助代理使用真实的主题到文件中拿数据preadinfoproxy->read(); // 后续调用read都是直接从缓存中拿数据preadinfoproxy->read(); // 从缓存中拿数据
#endifreturn 0;
}

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

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

相关文章

nestjs守卫/全局守卫校验jwt

一、守卫 目标 部分接口需要用户登录后才可以访问&#xff0c;用户登录后可以颁发 jwt_token 给前端&#xff0c;前端在调用需要鉴权的接口&#xff0c;需要在请求头添加 jwt_token&#xff0c;后端校验通过才能继续访问&#xff0c;否则返回403无权访问 创建守卫 anth 安装…

debezium数据脱敏配置介绍及源码分析

debezium官网地址参考&#xff1a; Debezium connector for MySQL :: Debezium Documentation 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;笔芯笔芯. CDC采集数据时会有字段包含敏感字符需要做脱敏处理&#xff0c;debezium提供了4种脱敏方案&#xff0c;注意只…

mysql:不要在索引列进行数学运算和函数运算

不要在索引列进行数学运算和函数运算。这是因为数学运算和函数运算会改变索引列的值&#xff0c;导致索引失效。 如果需要进行计算或函数处理&#xff0c;最好将数据取出并在应用程序中进行处理。 下面举个对照的例子&#xff1a; 1&#xff09;看语句explain select * from …

注塑模具ERP有哪些功能?可以帮助企业解决什么难题

不同的注塑模具有不同的业务流程和生产环节&#xff0c;有些生产企业在订单、物料需求计划、车间、班组负荷评估、项目成本核算、边角料统计分析等方面还存在不少问题。 与此同时&#xff0c;也有部分注塑模具企业通过ERP软件科学制定注塑生产排产&#xff0c;智能核算注塑物料…

09 光流法实践

文章目录 09 光流法实践9.1 光流法9.2 直接法9.3 总结 09 光流法实践 光流法需要提取关键点&#xff0c;而不需要计算描述子&#xff1b;直接法直接利用像素信息&#xff0c;无需特征点。 9.1 光流法 光流法基于 灰度不变假设&#xff0c;即第一帧中的关键点的灰度与其在第二…

用print太慢了!强烈推荐这款Python Debug工具~

作为程序员&#xff0c;我们都深知调试&#xff08;Debug&#xff09;在编程过程中的重要性。然而&#xff0c;使用传统的"print"语句进行调试可能效率较低&#xff0c;今天&#xff0c;笔者将推荐一款独具一格的Python调试工具——Reloadium。Reloadium为IDE添加了热…

深入理解Spring Security授权机制原理

原创/朱季谦 在Spring Security权限框架里&#xff0c;若要对后端http接口实现权限授权控制&#xff0c;有两种实现方式。 一、一种是基于注解方法级的鉴权&#xff0c;其中&#xff0c;注解方式又有Secured和PreAuthorize两种。 Secured如&#xff1a; 1 PostMapping("…

elementui select中添加新增标签

<el-select v-model"ruleForm.eventType" :placeholder"请选择事件类型&#xff0c;可手动添加" ref"template" clearable visible-change"(v) > visibleChange(v, template)"><el-option v-for"item in eventTypeOp…

多域名SSL证书选择什么品牌比较好?

选择适合的品牌是申请多域名SSL证书的重要一步。不同品牌的SSL证书提供商在性能、安全性和客户支持等方面各有特点。本文将详细介绍选择多域名SSL证书品牌时应考虑的因素&#xff0c;并推荐几个知名的SSL证书品牌。 首先&#xff0c;我们需要考虑的是品牌的声誉和可靠性。选择一…

短地址漏洞

漏洞条件&#xff1a; 当地址的长度不足 20 byte (40个十六进制字符) 时&#xff0c;以太坊虚拟机 EVM 会进行高位补0x0转发以太币时没有对地址长度进行验证 1. input 数据 交易的 input 数据分为三个部分&#xff1a; 1&#xff09;4字节&#xff0c;是方法名的Hash值&…

MySQL_11.InnoDB Buffer Pool原理与配置

1.buffer pool原理 (1)innodb_buffer_pool_instances&#xff1a; windows default 1个实例、windows default 8个实例; 将热点打散,提高并发的性能改善并发,通过降低竞争因为不同的线程读和写cached pages&#xff08;缓存页&#xff09; 内存小于1G默认1个,这个选项只有当设置…

Android开发中压缩文件和文件夹

Android开发中&#xff0c;我们经常会遇到上传文件&#xff0c;用到压缩文件、文件夹的功能&#xff0c;今天我们主要讲解这个功能&#xff0c;具体的实现如下&#xff1a; /*** 压缩文件和文件夹** param srcFileString 要压缩的文件或文件夹* param zipFileString 压缩完成的…

【论文极速读】视频检索中的模态均衡方法

【论文极速读】视频检索中的模态均衡方法 FesianXu 20231206 at Baidu Search Team 前言 传统的视频搜索系统相关性部分主要以文本匹配为基础手段&#xff0c;在其中引入多模态向量容易收到『模态不均衡』的问题&#xff0c;论文[1]尝试对其进行解决&#xff0c;本文进行笔记。…

【算法技术专题】精彩解密KMP算法之跃进式搜索的深度探索

KMP算法 KMP算法介绍KMP算法历史KMP算法思路性能损耗算法思路结构模型准备KMP算法的实现步骤生成next数组构建next数组原理生成nexf数组代码实现 代码案例解释说明 字符串对比操作代码案例解释说明 算法效果 KMP算法介绍 KMP算法&#xff08;Knuth-Morris-Pratt算法&#xff0…

02markdown-学习笔记

一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 换行符<br>标签 写入一段测试用的正文第二段测试文本,如果要对文本进行换行可以使用<br>标签 文本修饰符 字体为斜体的修饰&#xff0c;一对星号包含 字符为粗体&#xff0c;两对星号包含 字体为…

springboot 拦截器之Advisor不生效问题

SPringBoot使用方法注解拦截器时遇到不生效问题记录&#xff1a; 定义方法注解 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface DataScope {boolean enable() default true;}定义 Advisor Getter…

出现 java: 找不到符号 符号: 变量 log 的解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 增加编译参数3.2 增加lombok插件3.3 清楚本地缓存1. 问题所示 使用Springboot启动项目的时候,出现如下bug: java: 找不到符号符号: 变量 log位置: 类 org.springblade.example.consumer.rpc.BlogStu

如何定位线上OOM?

文章目录 造成OOM的原因1.一次性申请的太多2. 内存资源耗尽未释放3.本身资源不够 如何快速定位OOM&#xff1f;1.系统已经OOM了2.系统运行中还未OOM2.1导出dump文件&#xff1a;2.2.结合jvisualvm进行调试2.3 利用ArthasArthas可以做什么&#xff1f;如何使用Arthas小结 造成OO…

Docker常用命令总结

文章目录 Docker命令总结 Docker命令总结 简介&#xff1a;Docker是一个基于轻量级虚拟化技术的容器&#xff0c;整个项目基于Go语言开发&#xff0c;并采用了Apache 2.0协议。Docker可以将我们的应用程序打包封装到一个容器中&#xff0c;该容器包含了应用程序的代码、运行环…

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——(9.13.7-9.13.8)

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️创做不易&#xff0c;麻烦点个关注❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ ❤️❤️❤️❤️❤️❤️❤️❤️❤️文末有惊喜&#xff01;献舞一支&#xff01;❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目录 9.13…