当前位置: 首页 > article >正文

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 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.kler.cn/a/156314.html

相关文章:

  • 随时随地编码:香橙派Zero3上安装Code Server远程开发指南
  • 大厂的 404 页面都长啥样?看看你都见过吗~~~
  • Python 连接 Redis 进行增删改查(CRUD)操作
  • 2024-11-13 学习人工智能的Day26 sklearn(2)
  • C++中的栈(Stack)和堆(Heap)
  • 智能电视/盒子的应用管理——通过ADB工具优化体验
  • java基础之HashSet详解
  • uniapp连接蓝牙称(接收,发送)
  • Oracle下统计平均用餐时间、用餐总量、好评率
  • Mars3d标绘的时候通过绑定单击事件,查询点击落点的图层类型
  • “微流控芯片建模与肿瘤标志物/感染性疾病细胞分析:合成生物学的新前沿“
  • 编织魔法——我与计算机的不解之缘
  • STL中使用[]重载的类
  • dart 控制台应用
  • 小程序如何刷新当前页面?
  • SQL server 2016安装
  • IEEE 机器人最优控制开源库 Model-based Optimization for Robotics
  • 【开源】基于JAVA的校园电商物流云平台
  • 【C++】sizeof()、strlen()、length()\以及size()用法区别
  • 【每日一题】1038. 从二叉搜索树到更大和树-2023.12.4
  • python-GC机制、装饰器、生成器、迭代器、三元表达式、列表生成式、生成器表达式、函数递归、面向对象、
  • 【数据结构】八大排序 (三)
  • 如何精准操作无人机自动停机坪?
  • (c语言进阶)作业讲解
  • Docker pull 命令
  • 网件R8500 trojan