23种设计模式之C++实践(二)
23种设计模式之C++实践
- 3. 设计模式
-
- (二)组合型模式
-
- 7. 适配器模式——不兼容结构的协调
-
- 7.2:类适配器模式
- 7.3:双向适配器模式
- 适配器模式总结
- 8.桥接模式——处理多维度变化
-
- 桥接模式总结
- 9. 组合模式——树形结构的处理
-
- 9.2 透明组合模式
- 9.3 安全组合模式
- 组合模式总结
- 10. 装饰模式——扩展系统功能
-
- 装饰模式总结
- 11. 外观模式——提供统一入口
-
- 外观模式总结
- 12. 享元模式——实现对象的复用
-
- 享元模式总结
- 13. 代理模式——对象的间接访问
-
-
- 代理模式总结
-
3. 设计模式
(二)组合型模式
7. 适配器模式——不兼容结构的协调
-
适配器模式(Adapter Pattern):将一个接口转换为客户希望的另一个接口,使接口不兼容的那些类可以一起工作。
-
要点
- 适配器模式可分为对象适配器和类适配器。
- 对象适配器中,适配器与适配者之间是关联关系。
- 类适配器中,适配器与适配者之间是继承关系,使用频率更高。
-
结构图
-
对象适配器
-
类适配器
-
-
适用场景示例
学校教务管理系统:需要对学生成绩进程排序和查找。已经开发了成绩操作接口
ScoreOperation
,在成绩操作接口中声明了排序方法sort(int [])
和查找方法search(int[],int)
。现决定重用之前的算法库中的快速排序类QuickSort
和二分查找类BinarySearch
。 -
代码示例
// 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; }
-
代码测试
-
测试代码
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
-