设计模式-策略模式

策略模式(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对象,并演示了如何在运行时动态切换排序算法。

相关推荐
Jay_5158 分钟前
C++多态与虚函数详解:从入门到精通
开发语言·c++
xiaolang_8616_wjl1 小时前
c++文字游戏_闯关打怪
开发语言·数据结构·c++·算法·c++20
FrostedLotus·霜莲1 小时前
C++主流编辑器特点比较
开发语言·c++·编辑器
hqxstudying2 小时前
Java创建型模式---单例模式
java·数据结构·设计模式·代码规范
花好月圆春祺夏安3 小时前
基于odoo17的设计模式详解---装饰模式
数据库·python·设计模式
fie88893 小时前
浅谈几种js设计模式
开发语言·javascript·设计模式
哆啦A梦的口袋呀3 小时前
《深入设计模式》模式结构汇总
设计模式
花好月圆春祺夏安3 小时前
基于odoo17的设计模式详解---单例模式
单例模式·设计模式
liulilittle6 小时前
深度剖析:OPENPPP2 libtcpip 实现原理与架构设计
开发语言·网络·c++·tcp/ip·智能路由器·tcp·通信
在未来等你6 小时前
设计模式精讲 Day 22:模板方法模式(Template Method Pattern)
设计模式·模板方法模式·软件架构·java开发·面向对象设计·设计模式实战·java应用开发