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

设计模式-策略模式

策略模式(Strategy Pattern)作为一种行为型设计模式,通过定义一系列的算法,并将每个算法封装起来,使它们可以互换使用,从而提高系统的灵活性和可扩展性。

一、策略模式的原理

策略模式的核心思想是将算法的实现与使用分离,使得算法可以独立于客户端变化。它定义了一系列算法,并将每个算法封装在单独的类中,通过组合而非继承的方式,在运行时动态选择算法的实现。

策略模式通常包含三个主要角色:

  1. 策略接口(Strategy):定义了一个算法的公共接口,所有具体策略类都实现这个接口。
  2. 具体策略类(Concrete Strategy):实现了策略接口的具体算法。
  3. 上下文类(Context):维护一个策略对象的引用,并定义了一个接口供客户调用以执行算法。上下文类将具体的算法委托给策略对象来执行。

二、应用场景

策略模式广泛应用于需要算法替换和行为切换的场景中,例如:

  1. 不同类型的排序:在应用程序中,可以根据当前数据的特性选择最优的排序算法,如快速排序、归并排序等。
  2. 文件压缩:根据文件类型或大小选择不同的压缩算法,如zip、gzip等。
  3. 支付方式选择:在电商系统中,支持多种支付方式(如信用卡支付、第三方支付、货到付款等)。
  4. 促销活动:如满减促销、返现促销、打折促销等,每种促销方式都对应一个具体的策略实现。
  5. 游戏AI:根据不同关卡和难度,切换敌人的行为策略。

三、优缺点分析

优点

  1. 算法可互换:策略模式允许在运行时选择算法,提高了系统的灵活性和可扩展性。
  2. 降低耦合度:客户端与算法实现解耦,客户端只需要知道策略接口,不需要了解具体的算法实现。
  3. 简化条件语句:避免了在客户端代码中使用大量的条件判断语句来选择算法。
  4. 易于扩展:新增策略或修改策略时,不需要修改现有代码,符合开闭原则。

缺点

  1. 类数量增加:每定义一个策略,就需要新增一个类,可能会导致类数量过多,增加系统复杂度。
  2. 客户端需要了解不同策略:客户端选择合适的策略时,需要了解每种策略的差异。
  3. 策略间关系复杂时难以维护:如果策略之间存在复杂的关系,可能会增加维护和扩展的难度。

四、C++使用示例

下面是一个使用C++实现的策略模式示例,展示了如何使用策略模式实现不同排序算法的选择:

#include <iostream>
#include <vector>
#include <algorithm>// 策略接口
class SortingStrategy {
public:virtual void sort(std::vector<int>& arr) = 0;virtual ~SortingStrategy() {} // 虚析构函数以支持多态删除  
};// 具体策略类:冒泡排序
class BubbleSort : public SortingStrategy {
public:void sort(std::vector<int>& arr) override {// 冒泡排序实现代码...std::cout << "Using Bubble Sort" << std::endl;// 示例:简单排序std::sort(arr.begin(), arr.end());}
};// 具体策略类:快速排序
class QuickSort : public SortingStrategy {
public:void sort(std::vector<int>& arr) override {// 快速排序实现代码...std::cout << "Using Quick Sort" << std::endl;// 示例:简单排序std::sort(arr.begin(), arr.end());}
};// 上下文类
class SortingContext {
private:SortingStrategy* strategy;
public:SortingContext(SortingStrategy* strategy) : strategy(strategy) {}void setStrategy(SortingStrategy* newStrategy) {strategy = newStrategy;}void sortArray(std::vector<int>& arr) {strategy->sort(arr);}
};int main() {std::vector<int> arr = {5, 3, 1, 4, 2};SortingContext context(new BubbleSort()); // 初始策略为冒泡排序context.sortArray(arr); // 使用冒泡排序对数组进行排序context.setStrategy(new QuickSort()); // 切换策略为快速排序context.sortArray(arr); // 使用快速排序对数组进行排序return 0;
}

这个示例中,我们定义了一个排序策略接口SortingStrategy,以及两个具体策略类BubbleSort和QuickSort。SortingContext类作为上下文类,负责持有策略对象的引用,并根据客户端的需求调用相应的排序算法。在main函数中,我们创建了一个SortingContext对象,并演示了如何在运行时动态切换排序算法。


http://www.mrgr.cn/news/31589.html

相关文章:

  • 骨传导耳机哪家好?这五大热门高口碑骨传导耳机别错过!
  • LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)
  • npm i忽略依赖冲突
  • 全面介绍软件安全测试分类,安全测试方法、安全防护技术、安全测试流程
  • 开源库推荐,OpenMVG三维重建
  • FastHtml llmctx介绍
  • 【大屏方案】可视化综合展示系统解决方案(Word原件2024)
  • [Web安全 网络安全]-XSS跨站脚本攻击
  • MySQL中的函数简单总结,以及TCL语句的简单讲解
  • 手机切换IP简单方法:掌握技巧,轻松实现IP变换‌
  • 浅谈计算机视觉的学习路径1
  • 2024最新最全:Wireshark抓包详解(非常详细)零基础入门到精通,收藏这篇就够了
  • 2024 “华为杯” 中国研究生数学建模竞赛(A题)|风电场有功功率优化分配|数学建模完整代码+建模过程全解全析
  • 哪个牌子的麦克风好用?无线麦克风避坑指南:五大常见问题
  • 详解npm源及其使用方法
  • Vue vs React vs Angular 的区别和选择
  • 【SQL 用大白话描述事务并发 可能会遇到的问题】及解决策略
  • Java——认识String类
  • jsonschema - 校验Json内容和格式
  • 数据库某字段要保存中文时,怎样确定长度(以Oracle为例)
  • 变化检测(Change Detection)
  • 【OSS安全最佳实践】降低因账号密码泄露带来的未授权访问风险
  • linux C高级学习 2024.9.20
  • Elasticsearch 检索优化:停用词的应用
  • 充电宝什么品牌比较好?五大性价比高充电宝品牌推荐!
  • 2024华为杯研究生数学建模竞赛(研赛)选题建议+初步分析