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.rhkb.cn/news/209477.html

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

相关文章

【海思SS528 | VDEC】MPP媒体处理软件V5.0 | 视频解码模块——学习笔记

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

HR看好的字符函数和字符串处理函数!!!

本篇会加入个人的所谓‘鱼式疯言’❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言,而是理解过并总结出来通俗易懂的大白话,我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的&#xff0c;可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 前言 在本篇…

智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

深入理解Go语言GC机制

1、Go 1.3之前的标记-清除&#xff08;mark and sweep&#xff09;算法 Go 1.3之前的时候主要用的是普通的标记-清除算法&#xff0c;此算法主要由两个主要的步骤&#xff1a; 标记&#xff08;Mark phase&#xff09;清除&#xff08;Sweep phase&#xff09; 1&#xff09…

Spring Boot整合RabbitMQ

一、简介 在Spring项目中&#xff0c;可以使用Spring-Rabbit去操作RabbitMQ 尤其是在spring boot项目中只需要引入对应的amqp启动器依赖即可&#xff0c;方便的使用RabbitTemplate发送消息&#xff0c;使用注解接收消息。 一般在开发过程中&#xff1a; 生产者工程&#xf…

文心一言 VS 讯飞星火 VS chatgpt (148)-- 算法导论12.2 3题

三、用go语言&#xff0c;写出过程 TREE-PREDECESSOR 的伪代码。 文心一言&#xff1a; 以下是使用Go语言编写的TREE-PREDECESSOR函数的伪代码&#xff1a; func TREE-PREDECESSOR(node) { if node.parent ! nil { return node.parent } // 如果节点是根节点&#xff0c…

TDA4VM EVM开发板调试笔记

文章目录 1. 前言2. 官网资料导读3. 安装 Linux SDK4. 制作SD 启动卡5. 验证启动1. 前言 TDA4作为一般经典的车规级SOC芯片,基于它的低阶智驾方案目前成为各家智驾方案公司的量产首选,这也使得基于TDA4的开发需求陡增,开发和使用TDA4既要熟悉Linux驱应用开发,还要熟悉传统…

「计算机网络」Cisco Packet Tracker计算机网络仿真器的使用

介绍 Cisco Packet Tracker&#xff1a;网络仿真工具&#xff0c;用于模拟网络配置。 &#xff08;一&#xff09; 配置交换机&#xff08;Switch&#xff09;&#xff08;通过 带外管理&#xff09; 带外&#xff1a;Out-of-Band, OOB写在前面&#xff1a;如何打开Console页…

数据结构与算法-动态查找表

查找 &#x1f388;3动态查找表&#x1f52d;3.1二叉排序树&#x1f3c6;3.1.1二叉排序树的类定义&#x1f3c6;3.1.2二叉排序树的插入和生成&#x1f3c6;3.1.3二叉树的查找&#x1f3c6;3.1.4二叉排序树的删除 &#x1f52d;3.2平衡二叉树&#x1f3c6;3.2.1平衡二叉树的调整…

YOLOv8 区域计数 | 入侵检测 | 人员闯入

大家好,昨天的 YOLOv8 新增加了一个功能,区域计数,用这个功能我们能实现很多的任务, 比如入侵检测,流量统计,人员闯入等,使用方式也非常的方便,但是一定要使用最新版的 YOLOv8 代码(2023/12/03更新的代码)。 低版本是不具备这个功能的,上面是演示效果。 使用非常的方…

分享74个节日PPT,总有一款适合您

分享74个节日PPT&#xff0c;总有一款适合您 74个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/18YHKkyJsplx-Gjj7ofpFrg?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

如何赚钱?聊聊程序员的副业与生意

说到副业和赚钱一直都是大家非常关心的话题&#xff0c;特别是在今年大环境不好&#xff0c;各大公司频繁裁员的行情之下。单一的收入结构会导致家庭抗风险能力特别差。最近特别火的【中产陷阱话题】说的就是这个道理。 所以&#xff0c;获得除目前工资之外的其他收入&#xf…

C++ string类(1)—初始化、容量操作、迭代器

目录 前言 一、string类 二、初始化 1、无参或带参 2、用字符串变量初始化 3、用字符串初始化 4、指定数量字符 三、容量操作 1、size 2、push_back 3、append​编辑 4、运算符 5、reserve 6、resize 四、迭代器 1、正向迭代器 2、反向迭代器 3、const迭代器…

c++面试题

1.static的使用 1&#xff09;修饰局部变量&#xff1a;在函数内部使用static修饰局部变量&#xff0c;会使它成为静态局部变量。静态局部变量只会被初始化一次&#xff0c;且只有在第一次调用该函数时才会被初始化&#xff0c;之后每次调用该函数时都会保留上一次的值.从原来…

quickapp_快应用_父子组件传值

目录 页面级组件自定义组件(子组件)引入自定义组件(子组件)父组件给子组件传值子组件给父组件进行传值父组件调用子组件的方法 页面级组件 在pages中定义的组件被称为页面级组件。 页面级组件(等同于Vue页面)&#xff0c;通过路由配置可以进行页面跳转。 自定义组件(子组件)…

ESP32-Web-Server编程-简单的照片浏览器

ESP32-Web-Server编程-简单的照片浏览器 概述 从本节开始我们开始制作一些有趣的多媒体 Web 的示例。 当你希望在网页上展示一些广告、照片&#xff0c;或者你的开发板带摄像头&#xff0c;能够采集一些图片&#xff0c;这时你希望可以通过手头的浏览器查看图片&#xff0c;…

Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)

目录 Node.js 文件系统模块&#xff08;二&#xff09; Node.js 文件系统模块&#xff08;三&#xff09; Node.js 文件系统模块&#xff08;四&#xff09; Node.js 路径模块 Node.js 连接 MySQL Node.js nodemon Node.js 操作 MySQL Node.js 应用 Node.js 文件系统模块…

Python----练习:使用面向对象实现报名系统开发

第一步&#xff1a;分析哪些动作是由哪些实体发出的 学生提出报名 学生提供相关资料 学生缴费 机构收费 教师分配教室 班级增加学生信息 于是&#xff0c;在整个过程中&#xff0c;一共有四个实体&#xff1a;学生、机构、教师、班级&#xff01;在现实中的一个具体的实…

如何进行卷积特征可视化

大家好啊&#xff0c;我是董董灿。 之前写过很多关于卷积算法的文章&#xff1a;5分钟理解什么是卷积的特征提取。总的来说&#xff0c;卷积算法的本质是一个特征提取器。 那么既然卷积神经网络在图像分类、图像检测、图像分割以及其他领域有这么好的表现&#xff0c;卷积到底…

Java 不要在父类的构造方法里面调用可以被子类重写的方法

不要在父类的构造方法(代码块)里面调用可以被子类重写的方法 我们从第一天学习Java开始&#xff0c;就对Java的类初始化顺序牢记于心。但是在实际开发过程中&#xff0c;似乎很难能接触这一部分的应用。在这之前&#xff0c;我也认为它只是面试中八股文而已&#xff0c;直到最…