设计模式-策略模式

策略模式(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++实现的策略模式示例,展示了如何使用策略模式实现不同排序算法的选择:

cpp 复制代码
#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对象,并演示了如何在运行时动态切换排序算法。

相关推荐
唐诺4 小时前
几种广泛使用的 C++ 编译器
c++·编译器
冷眼看人间恩怨5 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客5 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin5 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos7 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室7 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0017 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
这是我587 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc7 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存
呆萌很8 小时前
C++ 集合 list 使用
c++