策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它的核心思想是将算法(或行为)封装成独立的策略类,使它们可以相互替换,从而让算法的变化独立于使用算法的客户端

这种模式通过分离 “使用算法的代码” 和 “算法本身身”,提高了代码的灵活性和可维护性。

策略模式的核心角色

  1. 环境类(Context)
    持有一个策略类的引用,负责调用具体的策略。客户端通过环境类来使用策略,无需直接与策略类交互。

  2. 抽象策略类(Strategy)
    定义所有具体策略的公共接口(通常是抽象类或接口),声明策略执行的方法。

  3. 具体策略类(ConcreteStrategy)
    实现抽象策略类定义的接口,包含具体的算法逻辑。

适用场景

  • 多个算法完成同一任务,但实现细节不同(如排序算法:快速排序、冒泡排序等)。
  • 需要在运行时动态切换算法(如不同的支付方式:支付宝、微信支付、银行卡支付)。
  • 避免使用多重条件判断(if-else 或 switch),用策略类替代。

C++ 代码示例

以 “支付系统” 为例,不同支付方式(支付宝、微信)作为不同策略:

#include <iostream>
#include <string>

// 1. 抽象策略类:定义支付接口
class PaymentStrategy {
public:
    virtual ~PaymentStrategy() = default;  // 虚析构函数,确保正确释放
    virtual void pay(double amount) const = 0;  // 纯虚函数:支付方法
};

// 2. 具体策略类1:支付宝支付
class AlipayStrategy : public PaymentStrategy {
private:
    std::string username;  // 支付宝账号
public:
    AlipayStrategy(std::string name) : username(std::move(name)) {}
    
    void pay(double amount) const override {
        std::cout << "用户 " << username << " 使用支付宝支付了 " << amount << " 元" << std::endl;
    }
};

// 3. 具体策略类2:微信支付
class WechatPayStrategy : public PaymentStrategy {
private:
    std::string openid;  // 微信OpenID
public:
    WechatPayStrategy(std::string id) : openid(std::move(id)) {}
    
    void pay(double amount) const override {
        std::cout << "用户 " << openid << " 使用微信支付了 " << amount << " 元" << std::endl;
    }
};

// 4. 环境类:订单(使用支付策略)
class Order {
private:
    double totalAmount;  // 订单总金额
    const PaymentStrategy& paymentStrategy;  // 持有策略引用

public:
    // 构造函数:传入总金额和具体支付策略
    Order(double amount, const PaymentStrategy& strategy)
        : totalAmount(amount), paymentStrategy(strategy) {}
    
    // 执行支付(委托给策略类)
    void pay() const {
        paymentStrategy.pay(totalAmount);
    }
};

// 客户端代码
int main() {
    // 创建具体策略对象
    AlipayStrategy alipay("zhangsan123");
    WechatPayStrategy wechat("o6_bmjrPTlm6_2sgVt7hMZOPfL2M");
    
    // 创建订单并指定支付策略
    Order order1(99.9, alipay);  // 用支付宝支付
    Order order2(199.5, wechat); // 用微信支付
    
    // 执行支付(运行时确定具体策略)
    order1.pay();
    order2.pay();
    
    return 0;
}

代码说明

  1. 抽象策略(PaymentStrategy:定义了 pay() 纯虚函数,是所有支付方式的统一接口。

  2. 具体策略(AlipayStrategyWechatPayStrategy
    分别实现了支付宝和微信的支付逻辑,继承自 PaymentStrategy

  3. 环境类(Order
    包含订单金额和支付策略的引用,通过 pay() 方法调用策略的支付逻辑,自身不关心具体支付方式。

  4. 客户端
    创建具体策略对象,将其传递给环境类(订单),实现了 “支付方式与订单逻辑” 的解耦。

策略模式的优缺点

优点

  • 算法可以独立于客户端变化,便于扩展新策略(如新增 “银行卡支付” 只需加一个类)。
  • 避免多重条件判断,代码更清晰、易维护。
  • 符合 “开闭原则”(对扩展开放,对修改关闭)。

缺点

  • 客户端需要了解所有策略类的存在,才能选择合适的策略。
  • 策略类数量可能增多(每种算法对应一个类)。

策略模式的核心价值在于 “分离变化”—— 将易变的算法逻辑封装起来,让系统更灵活、更易于扩展。

更多推荐