什么是策略模式
·
策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,它的核心思想是将算法(或行为)封装成独立的策略类,使它们可以相互替换,从而让算法的变化独立于使用算法的客户端。
这种模式通过分离 “使用算法的代码” 和 “算法本身身”,提高了代码的灵活性和可维护性。
策略模式的核心角色
-
环境类(Context):
持有一个策略类的引用,负责调用具体的策略。客户端通过环境类来使用策略,无需直接与策略类交互。 -
抽象策略类(Strategy):
定义所有具体策略的公共接口(通常是抽象类或接口),声明策略执行的方法。 -
具体策略类(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;
}
代码说明
-
抽象策略(
PaymentStrategy):定义了pay()纯虚函数,是所有支付方式的统一接口。 -
具体策略(
AlipayStrategy、WechatPayStrategy):
分别实现了支付宝和微信的支付逻辑,继承自PaymentStrategy。 -
环境类(
Order):
包含订单金额和支付策略的引用,通过pay()方法调用策略的支付逻辑,自身不关心具体支付方式。 -
客户端:
创建具体策略对象,将其传递给环境类(订单),实现了 “支付方式与订单逻辑” 的解耦。
策略模式的优缺点
优点:
- 算法可以独立于客户端变化,便于扩展新策略(如新增 “银行卡支付” 只需加一个类)。
- 避免多重条件判断,代码更清晰、易维护。
- 符合 “开闭原则”(对扩展开放,对修改关闭)。
缺点:
- 客户端需要了解所有策略类的存在,才能选择合适的策略。
- 策略类数量可能增多(每种算法对应一个类)。
策略模式的核心价值在于 “分离变化”—— 将易变的算法逻辑封装起来,让系统更灵活、更易于扩展。
更多推荐

所有评论(0)