代理模式-C语言实现

UML图:

代码实现:

#include <stdio.h>// 抽象主题接口
typedef struct {void (*request)(void*);
} Subject;// 具体主题类
typedef struct {void (*request)(void*);
} RealSubject;void RealSubject_request(void* obj) {printf("RealSubject: Handling request\n");
}RealSubject createRealSubject() {RealSubject subject;subject.request = RealSubject_request;return subject;
}// 代理类
typedef struct {RealSubject realSubject;void (*request)(void*);
} Proxy;void Proxy_request(void* obj) {Proxy* proxy = (Proxy*)obj;printf("Proxy: Logging request\n");proxy->realSubject.request(&proxy->realSubject);printf("Proxy: Logging response\n");
}Proxy createProxy() {Proxy proxy;proxy.realSubject = createRealSubject();proxy.request = Proxy_request;return proxy;
}int main() {Proxy proxy = createProxy();proxy.request(&proxy);return 0;
}

在上面的示例代码中,首先定义了抽象主题接口Subject,其中包含了一个请求处理的函数指针。然后定义了具体主题类RealSubject,它实现了抽象主题接口中的函数。

接着定义了代理类Proxy,它包含了一个指向具体主题对象的引用,并实现了与具体主题相同的接口函数。

main函数中,创建了代理对象proxy,并通过代理对象来发起请求。

代理模式的优点:

  1. 可以实现对目标对象的访问控制,例如验证权限、监控访问等。

  2. 可以实现延迟加载,当真正需要时才创建或访问目标对象,提高系统性能。

  3. 可以隐藏目标对象的具体实现细节,保护目标对象的安全。

代理模式的缺点:

  1. 增加了系统复杂性,引入了额外的代理对象。

  2. 可能会降低系统的性能,特别是在需要频繁访问目标对象时。

适用场景:

  1. 需要对访问对象进行控制和管理,如权限验证、缓存等。

  2. 需要对目标对象进行扩展,例如增加额外的操作。

  3. 需要对目标对象进行保护,隐藏其具体实现细节。

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

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

相关文章

win10下载Remix IDE桌面版以及空白页面的解决

文章目录 Remix IDE 的下载Remix IDE 空白页面的解决 Remix IDE 的下载 到 github 地址 https://github.com/ethereum/remix-desktop/releases 选择exe文件或根据自己电脑版本选择对应的zip文件进行下载&#xff0c;然后正常安装即可。 Remix IDE 空白页面的解决 有时打开Remix…

docker容器的生命周期管理常用命令

容器的生命周期管理命令 docker create &#xff1a;创建一个新的容器但不启动它 docker create nginx docker run :创建一个新的容器并运行一个命令 常用选项&#xff1a; 常用选项1. --add-host&#xff1a;容器中hosts文件添加 host:ip 映射记录 2. -a, --attach&#…

自动驾驶HWP 功能规范

目 录 概述 1 目的 1范围 1术语及缩写 1设计与实验标准 1 设计标准 2设计标准执行优先顺序 2功能规范 Specification 4 功能描述 Functional Description 4 工作条件与应用范围 Application Scope 4道路交通 4天气与光线 4传感器方案及需求 5 驾驶员状态监控系统 5前视摄像…

【STL】string类 (下)

目录 1&#xff0c;insert 2&#xff0c;erase 3&#xff0c;find 4&#xff0c;replace 5&#xff0c;rfind 6&#xff0c;substr 7&#xff0c;find_first_of 8&#xff0c;find_first_not_of 9&#xff0c;find_last_of 10&#xff0c;operator 11&#xff0c;ge…

深入理解对象与垃圾回收机制

1、虚拟机中对象创建过程 1.1 对象创建过程 当我们使用 new 创建一个对象时&#xff0c;在 JVM 中进行了如下操作&#xff1a; 类加载&#xff1a;把 class 加载到 JVM 运行时数据区的过程。可以通过本地文件的形式&#xff0c;也可以通过网络加载。 检查加载&#xff1a;首…

docker环境日志常用命令

Docker命令官方文档 Reference documentation | Docker Docs Docker环境信息命令 docker info : 显示 Docker 系统信息&#xff0c;包括镜像和容器数。 docker info docker version : 显示 Docker 版本信息。 docker version // or docker version [OPTIONS] OPTIONS说明&…

Leetcode 2940. Find Building Where Alice and Bob Can Meet

Leetcode 2940. Find Building Where Alice and Bob Can Meet 1. 解题思路2. 代码实现3. 算法优化 题目链接&#xff1a;2940. Find Building Where Alice and Bob Can Meet 1. 解题思路 这一题本质上又是限制条件下求极值的问题&#xff0c;算是我最不喜欢的题目类型之一吧…

【Linux 操作系统配置 SFTP】

Linux 操作系统配置 SFTP sftp采用的是ssh加密隧道&#xff0c;安装性方面较ftp强&#xff0c;而且依赖的是系统自带的ssh服务&#xff0c;不像ftp还需要额外的进行安装基于 ssh 的 sftp 服务相比 ftp 有更好的安全性&#xff08;非明文帐号密码传输&#xff09;和方便的权限管…

【23真题】大题全原题的211!题源已定位!

今天分享的是23年长安大学814的信号与系统试题及解析。 本套试卷难度分析&#xff1a;22年长安大学814考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&#xff01;本套试题难度中等偏下&#xff0c;题量偏多&#xff0c;考察的知识点也是很常见的…

Robot Framework自动化测试(四)--- 分层思想

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Chatbot开发三剑客:LLAMA、LangChain和Python

聊天机器人&#xff08;Chatbot&#xff09;开发是一项充满挑战的复杂任务&#xff0c;需要综合运用多种技术和工具。在这一领域中&#xff0c;LLAMA、LangChain和Python的联合形成了一个强大的组合&#xff0c;为Chatbot的设计和实现提供了卓越支持。 首先&#xff0c;LLAMA是…

如何往excel中写子表?

with pd.ExcelWriter("C:/last_date.xlsx") as writer:for i in range(0, 10):df pd.DataFrame()df.to_excel(writer, indexFalse, sheet_namestr(days[i 1]))

flutter布局详解及代码示例(下)

布局 基本布局 GridView&#xff08;二维滚动列表&#xff09;&#xff1a;比ListView多了一个方向的数据填充。ListBody&#xff08;滚动列表&#xff09;&#xff1a;相比ListView&#xff0c;没有回收复用&#xff0c;简单易用。Table&#xff08;表格布局&#xff09;&am…

OpenCV入门11——图像的分割与修复

文章目录 图像分割的基本概念实战-分水岭法(一)实战-分水岭法(二)GrabCut基本原理实战-GrabCut主体程序的实现实战-GrabCut鼠标事件的处理实战-调用GrabCut实现图像分割meanshift图像分割视频前后景分离其它对视频前后影分离的方法图像修复 图像分割是计算机视觉中的一个重要领…

Docker智驾开发环境搭建

文章目录 背景1. 什么是容器?2. 什么是Docker?2.1 Docker架构3. 为什么要使用Docker?3.1 Docker容器虚拟化的好处3.2 Docker在开发和运维中的优势4. Docker容器与传统虚拟化的区别4.1 区别4.2 Docker的优势5. Docker的核心概念6. Docker在嵌入式开发中的应用7. docker实践参…

deque容器结构学习笔记

1.结构图 2.deque对比vector和list deque双端队列&#xff0c;就像是list和vector的结合 vector&#xff1a; 优点&#xff1a;1.可以随机读取 2. 空间利用率高 缺点&#xff1a;1. 除了尾插尾删&#xff0c;其他插入删除效率比较低 2. 扩容效率低 list&#xff1a; 优点&…

好用的png图片打包plist工具,推荐使用pngPackerGUI_V2.0

png图片打包plist工具&#xff0c;手把手教你使用pngPackerGUI_V2.0此软件是在pngpacker_V1.1软件基础之后&#xff0c;开发的界面化操作软件&#xff0c;方便不太懂命令行的小白快捷上手使用。1.下载并解压缩软件&#xff0c;得到如下目录&#xff0c;双击打开 pngPackerGUI.e…

C#连接Redis

**第一步:nuget包——ServiceStack.Redis ** public RedisCache _iCache = new RedisCache(); public void test(){string tokenKey = "";Token authToken = _iCache.Get<Token>(tokenKey);if (authToken == null){authToken = new Token();authToken.SignT…

C++STL——string类详解及其模拟实现

CSTL——string类 1. STL简介 STL全称standard template libaray&#xff0c;译为标准模板库 需要注意&#xff0c;STL不是C的标准库&#xff0c;而是C标准库的重要组成部分STL是一个包含众多数据结构和算法的软件框架 下面展示STL的六大组件&#xff1a; 本章&#xff0c;我…

base64 前端显示 data:image/jpg;base64

在css里的写法&#xff1a; #est_switch {background: url(data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAA…