23种设计模式之C++实践(二)

23种设计模式之C++实践

  • 3. 设计模式
    • (二)组合型模式
      • 7. 适配器模式——不兼容结构的协调
        • 7.2:类适配器模式
        • 7.3:双向适配器模式
        • 适配器模式总结
      • 8.桥接模式——处理多维度变化
        • 桥接模式总结
      • 9. 组合模式——树形结构的处理
        • 9.2 透明组合模式
        • 9.3 安全组合模式
        • 组合模式总结
      • 10. 装饰模式——扩展系统功能
        • 装饰模式总结
      • 11. 外观模式——提供统一入口
        • 外观模式总结
      • 12. 享元模式——实现对象的复用
        • 享元模式总结
      • 13. 代理模式——对象的间接访问
          • 代理模式总结

3. 设计模式

(二)组合型模式

7. 适配器模式——不兼容结构的协调

  1. 适配器模式(Adapter Pattern):将一个接口转换为客户希望的另一个接口,使接口不兼容的那些类可以一起工作。

  2. 要点

    1. 适配器模式可分为对象适配器和类适配器。
    2. 对象适配器中,适配器与适配者之间是关联关系。
    3. 类适配器中,适配器与适配者之间是继承关系,使用频率更高。
  3. 结构图

    1. 对象适配器

    2. 类适配器

  4. 适用场景示例

    学校教务管理系统:需要对学生成绩进程排序和查找。已经开发了成绩操作接口ScoreOperation,在成绩操作接口中声明了排序方法sort(int [])和查找方法search(int[],int)。现决定重用之前的算法库中的快速排序类QuickSort和二分查找类BinarySearch

  5. 代码示例

    // ScoreOperation.h
    /*** @brief 成绩操作接口**/
    class ScoreOperation {public:virtual void sort(int* array, int len) = 0;virtual int search(int* array, int len, int key) = 0;
    };/*** @brief 成绩操作适配器**/
    class OperationAdapter : public ScoreOperation {private:CommonToolNS::QuickSort* sortObj;CommonToolNS::BinarySearch* searchObj;public:OperationAdapter() {sortObj = new CommonToolNS::QuickSort();searchObj = new CommonToolNS::BinarySearch();}public:void sort(int* array, int len) override;int search(int* array, int len, int key) override;
    };// ScoreOperation.cpp
    void OperationAdapter::sort(int* array, int len) {sortObj->quickSort(array, len);return;
    }int OperationAdapter::search(int* array, int len, int key) {int flag = searchObj->binarySearch(array, len, key);return flag;
    }// CommonTool.h
    class QuickSort {public:/*** @brief 快速排序** @param array* @param len*/void quickSort(int* array, int len);private:void sort(int* array, int p, int r);int partition(int* array, int p, int r);void swap(int* array, int i, int j);
    };class BinarySearch {public:/*** @brief 二分查找** @param array* @param len* @param key* @return int*/int binarySearch(int* array, int len, int key);
    };class Log {public:static void print(int* array, int len);
    };// CommonTool.cpp
    void QuickSort::quickSort(int* array, int len) {sort(array, 0, len - 1);return;
    }void QuickSort::sort(int* array, int p, int r) {int q = 0;if (p < r) {q = partition(array, p, r);sort(array, p, q - 1);sort(array, q + 1, r);}return;
    }int QuickSort::partition(int* array, int p, int r) {int x = array[r];int j = p - 1;for (int i = p; i <= r - 1; ++i) {if (array[i] <= x) {j++;swap(array, j, i);}}swap(array, j + 1, r);return j + 1;
    }void QuickSort::swap(int* array, int i, int j) {int t = array[i];array[i] = array[j];array[j] = t;return;
    }int BinarySearch::binarySearch(int* array, int len, int key) {int low = 0;int high = len - 1;while (low <= high) {int mid = (low + high) / 2;int midVal = array[mid];if (midVal < key) {low = mid + 1;} else if (midVal > key) {high = mid - 1;} else {return 1;}}return -1;
    }void Log::print(int* array, int len) {printf("array: ");for (int i = 0; i < len; ++i) {printf("%d ", array[i]);}printf("\n");return;
    }
    
  6. 代码测试

    • 测试代码

      int main(int argc, char** argv) {printf("I'm Adapter Pattern!\n");// begin testint scores[] = {34, 54, 23, 100, 66, 23, 76, 89, 98};ScoreOperation* scoreOperation = new OperationAdapter();scoreOperation->sort(scores, 9);Log::print(scores, 9);printf("查找成绩为98的学生:");if (scoreOperation->search(scores

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

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

相关文章

解读Java虚拟机垃圾回收器:探究经典算法背后的奥秘

目录 一、GC分类与性能指标 &#xff08;一&#xff09;垃圾回收器分类 &#xff08;二&#xff09;性能指标 &#xff08;三&#xff09;不可能三角 二、不同的垃圾回收器概述 三、Serial回收器&#xff1a;串行回收 四、ParNew回收器&#xff1a;并行回收 五、Parall…

php使用CORS解决跨域

CORS 是一种由 W3C 制定的跨域资源共享标准&#xff0c;通过在服务器端设置 HTTP 头来实现跨域请求。 在 PHP 中&#xff0c;可以通过设置响应头来启用 CORS&#xff1a; <?php // 服务器端 PHP 文件 header(Access-Control-Allow-Origin: *); // 允许所有域名访问 heade…

Spring Boot 集成 spring security 01

一、导入依赖&#xff08;pom.xml&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&qu…

态势感知是什么

在当今高度信息化的时代&#xff0c;信息安全风险已经成为企业、政府和个人的重要关注点。为了有效应对这些风险&#xff0c;态势感知成为了一种日益重要的能力。态势感知是一种基于环境的、动态、整体地洞悉安全风险的能力&#xff0c;是以安全大数据为基础&#xff0c;从全局…

软件产品经理常用的ChatGPT通用提示词模板

产品规划和发展战略&#xff1a;请帮助我制定软件产品的规划和发展战略&#xff0c;包括市场调研、用户需求分析、产品定位、竞争对手分析等方面的内容&#xff0c;以便我能够更好地把握市场机会并制定相应的发展策略。 产品设计和开发&#xff1a;请帮助我进行软件产品的设计…

听GPT 讲Rust源代码--src/tools(5)

File: rust/src/tools/rust-analyzer/crates/hir-ty/src/mir/lower.rs 在Rust源代码中&#xff0c;lower.rs文件位于Rust Analyzer项目的hir-ty子库中&#xff0c;其目的是将高级中间表示&#xff08;HIR&#xff09;降低为中间表示&#xff08;MIR&#xff09;。下面对文件及其…

Python----文件备份案例

实例代码 # 1、接收用户输入的文件名&#xff08;要备份的文件名&#xff09; oldname input(请输入要备份的文件名称&#xff1a;) # python.txt # 2、规划备份文件名&#xff08;python[备份].txt&#xff09; # 搜索点号 index oldname.rfind(.) # 返回文件名和文件后缀 …

数据结构-归并排序

归并排序 基本概念 归并是指将两个或两个以上的有序表合并成一个有序表。 基本思想 假设有N个记录&#xff0c;则可以看成是N个有序的子序列&#xff0c;每个子序列的长度为1&#xff0c;然后两两归并得到[n/2] 个&#xff08;上取整&#xff09;长度为2的子序列&#xff…

css实现最简单的3d透视效果,通过旋转可以直观感受到

css的3d效果还是非常复杂的&#xff0c;我今天简单学习了一下入门&#xff0c;实现了一个超级简单的效果&#xff0c;帮助我自己理解这个3d的过程&#xff0c;实现的效果动画如下&#xff1a;可以通过调整父元素旋转的角度&#xff0c;更加直观的感受这个3d效果&#xff1a; 实…

【开源视频联动物联网平台】j2mod库对指令码的定义

在J2Mod库中&#xff0c;Modbus通信使用指令码来标识要执行的操作。指令码&#xff08;Function Code&#xff09;是Modbus协议中用于定义请求和响应类型的数字代码。不同的指令码表示不同的功能&#xff0c;例如读取保持寄存器、写入单个寄存器等。以下是一些常见的Modbus指令…

C/S与B/S的区别

B/S与C/S理解 C/S结构B/S结构问题数据放在服务器端与客户端的利弊 C/S结构 客户端&#xff1a;用户安装的软件 服务端&#xff1a;统一管理数据库的主机中的软件 叫做服务端。 B/S结构 用户通过浏览器实现&#xff08;往往表示业务逻辑在前端进行实现&#xff0c;主要业务逻…

【数据结构初阶】双向链表

各位读者老爷好&#xff0c;很高兴你又来读本鼠鼠的博客。鼠鼠我呀基于C语言实现一下双向链表&#xff0c;有兴趣的读者老爷可以瞅瞅哈&#xff01; 目录 1.定义双向链表节点 2.初始化哨兵位 3.双向链表销毁 4.双向链表打印 5.双向链表在pos的前面进行插入 6.双向链表删除…

初学者如何入门深度学习:以手写数字字符识别为例看AI 的学习路径,一图胜千言!超多高清大图收集整理

文章大纲 深度神经网络机器学习,深度学习,数据发掘之间的关系理解深度神经网络最好的可视化工具深度学习基础概念能解决神马种类的问题?卷积池化以手写字符识别为例讲述深度学习的分类问题MNIST 数据集简介初学者入门 :生成式 AI -- generative-ai-for-beginners从神经网络…

Linux系统之部署Plik临时文件上传系统

Linux系统之部署Plik临时文件上传系统 一、Plik介绍1.1 Plik简介1.2 Plik特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本 四、下载Plik软件包4.1 创建下载目录4.2 下载Plik软件包4.3 查看下载的Plik软件…

3.4_1 java自制小工具 - pdf批量转图片

相关链接 目录参考文章&#xff1a;pdf转图片(apache pdfbox)参考文章&#xff1a;GUI界面-awt参考文章&#xff1a;jar包转exe(exe4j)参考文章&#xff1a;IDEA导入GIT项目参考文章&#xff1a;IDEA中使用Gitee管理代码gitee项目链接&#xff1a;pdf_2_image网盘地址&#xf…

Mysql安全之基础合规配置

一、背景 某次某平台进行安全性符合型评估时&#xff0c;列出了数据库相关安全选项&#xff0c;本文特对此记录&#xff0c;以供备忘参考。 二、安全配置 2.1、数据库系统登录时的用户进行身份标识和鉴别&#xff1b; 1&#xff09;对登录Mysql系统用户的密码复杂度是否有要…

Nacos 客户端版本从1.x 升级到 2.x 的排坑记

问题描述 应用引入 Nacos Config 配置管理功能&#xff0c;应用启动时读取 Nacos 配置中心的配置作为启动参数&#xff0c;其中包括数据源信息 url 。 当 Nacos 正在进行 GC 操作、无法响应客户端请求时&#xff0c;应用端刚启动时发送的登录认证请求 http://IP:PORT/nacos/v…

Azure Machine Learning - 使用 Python 进行语义排名

在 Azure AI 搜索中&#xff0c;语义排名是查询端功能&#xff0c;它使用 Microsoft AI 对搜索结果重新评分&#xff0c;将具有更多语义相关性的结果移动到列表顶部。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&am…

单链表的模拟实现

单链表的模拟实现 一&#xff1a;单链表的概念&#xff1a;二&#xff1a;单链表中的方法&#xff1a;1&#xff1a;得到单链表的长度2&#xff1a;查找是否包含关键字key是否在单链表当中3&#xff1a;打印单链表中的数据&#xff1a;display&#xff08;&#xff09;3&#x…

WPF实现文字纵向排布的TabItem

文章目录 基本用法文字竖排显示 WPF布局 基本用法 WPF中的TabControl是一个容器控件&#xff0c;用于在单个窗体或页面中承载多个选项卡。每个选项卡可以包含不同的控件&#xff0c;用于显示不同的内容&#xff0c;其最简单的调用方法如下&#xff0c;只需在TabControl中无脑…