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

news2025/4/13 12:39:09

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 test
        int 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.coloradmin.cn/o/1279356.html

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

相关文章

【数据库】数据库基于封锁机制的调度器,使冲突可串行化,保障事务和调度一致性

封锁使可串行化 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定期更…

MySQL 教程 1.5

MySQL 创建数据表 创建 MySQL 数据表需要以下信息&#xff1a; 表名表字段名定义每个表字段的数据类型 语法 以下为创建 MySQL 数据表的 SQL 通用语法&#xff1a; CREATE TABLE table_name (column1 datatype,column2 datatype,... ); table_name 是你要创建的表的名称。…

鸿蒙基础入门与高频知识点梳理

介绍鸿蒙高频知识点&#xff0c;持续更新中 一、鸿蒙代码结构 ├──entry/src/main/ets // 代码区 │ ├──common │ │ └──Constant.ets // 常量类 │ ├──entryability │ │ └──EntryAbility.ts // 程序入口类 │ ├──p…

学习-java多线程面试题

为什么不建议用Executors启动线程池 *队列LinkedBlockingQueue是没有边界的队列,请求多会造成OOM *建议使用ThreadPoolExecutors 线程池中提交一个任务的流程&#xff1f; 1先判断线程池是否有线程&#xff0c;如果与就直接执行&#xff0c;没有就放队列 2如果队列满了&#…

【ArcGIS Pro微课1000例】0041:Pro强大的定位搜索功能、定位窗格、地图上查找地点

一谈到搜索,你是不是还停留在矢量数据的属性表中呢?今天给大家介绍ArcGIS Pro中定位搜索强大功能的使用,可以基于在线地图、矢量数据等多种数据源,进行地址、地名、道路、坐标等的查找。 文章目录 一、定位工具介绍二、在线地图搜索三、本地矢量数据搜索四、无地图搜索五、…

Makefile初学之谜之隐式规则

刚开始学习Make教程&#xff1a;https://makefiletutorial.vercel.app/#/docs/fancy-rules&#xff0c;里面有个sample: objects foo.o bar.o all.o all: $(objects)# These files compile via implicit rules foo.o: foo.c bar.o: bar.c all.o: all.call.c:echo "int…

分布式事务有哪些解决方案?

本文我们来讨论下分布式事务的相关知识点。 分布式事务是分布式系统中非常重要的一部分&#xff0c;最典型的例子是银行转账和扣款&#xff0c;A 和 B 的账户信息在不同的服务器上&#xff0c;A 给 B 转账 100 元&#xff0c;要完成这个操作&#xff0c;需要两个步骤&#xff0…

java蚁群算法的物流管理系统eclipse定制开发mysql数据库BS模式java编程百度地图

一、源码特点 java 基于蚁群算法的物流管理系统是一套完善的web设计系统 &#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&a…

Debian下载安装教程

目录 一.前言二.下载三.安装 一.前言 这篇文章展示如何使用VMware Workstation Player安装Debian12虚拟机。 二.下载 官网地址&#xff1a;官网 进入官网之后可以直接点击下载Debian选项&#xff0c;这样下载的是最新版的网络安装镜像。 三.安装 使用VMware Workstation P…

听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;。下面对文件及其…

一、Zookeeper基本知识

目录 1、ZooKeeper概述 2、ZooKeeper特性 3、ZooKeeper集群角色 ​​​​​​​1、ZooKeeper概述 Zookeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录…

3D模型材质编辑

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 如今&#xff0c;3D 纹理、打印和建模都非常流行。使用可用的高级工具&#xff0c;创建 3D 模型…

vscode插件离线下载

离线下载插件地址&#xff1a;https://marketplace.visualstudio.com/VSCode

SmartSoftHelp8,json格式化,校验工具

json格式化&#xff0c;校验工具 json 校验 json 格式化 本地校验 本地格式化 不需要联网 下载地址&#xff1a; https://pan.baidu.com/s/1zBgeYsqWnSlNgiKPR2lUYg?pwd8888​​​​​​​

前后端数据传输格式(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 作为后端&#xff0c;写…

矩阵代数与MATLAB实现(特征值、广义特征值、酋矩阵、奇异值、托普利兹矩阵、汉克尔矩阵、范德蒙矩阵、)

矩阵代数的相关知识 目录 一、特征值与特征向量 1、特征值与特征向量 2、MATLAB计算 二、广义特征值与广义特征向量 1、广义特征值与广义特征向量 2、MATLAB计算 三、酋矩阵 1、酋矩阵 2、MATLAB计算 四、矩阵的奇异值分解 1、奇异值 2、MATLAB计算 五、托普利兹矩…

Spring事务管理介绍

文章目录 Spring事务管理1 Spring事务简介【重点】问题导入1.1 Spring事务作用1.2 需求和分析1.3 代码实现【前置工作】环境准备【第一步】在业务层接口上添加Spring事务管理【第二步】设置事务管理器(将事务管理器添加到IOC容器中)【第三步】开启注解式事务驱动【第四步】运行…

阿里系列-淘宝接口抓取及相关问题

阿里系-淘宝接口抓取 一、安装charlse抓包工具 官方下载地址 安装证书 二、安装xposed hook框架 Xponsed简介 具体安装步骤 三、安装模块 关闭阿里系ssl验证 开启http模式 支持支付宝、淘宝、淘宝直播各个接口抓取 四、效果如下 接下去一段时间更新阿里系相关接口 文章目录 一、…

WIN10 WIN11 关闭更新的绝佳办法(极简单无副作用)

WIN10 WIN11 关闭更新的绝佳办法&#xff08;极简单无副作用&#xff09; 极其简单用实用可以关闭更新20年 winr&#xff0c;输入regedit 打开注册表打开注册表的这个路径&#xff1a; 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键空白的地方…

Redis 入门、基础。(五种基本类型使用场景)

文章目录 1. 概况1.1 认识 NoSQL1.1.1 查询方式1.1.2 事务1.1.3 总结 2. 认识 Redis4. Redis 常见命令4.1 Redis 数据结构介绍4.2 Redis 通用命令4.3 Redis 命令之 String 命令4.4 Redis 命令的层级结构4.5 Redis 命令之 Hash 命令4.6 Redis 命令之 List 命令4.7 set 唯一不排序…