策略模式 解决的是 对象的行为变化问题,封装可替换的行为。 关注点是 如何实现算法或行为。
一. 策略模式简介
策略模式:
定义一组可互换的算法, 将每个算法封装起来,使它们可以互相替换,并让算法的变化独立于使用算法的客户。
其实,就是多态的一种典型的用法。
优点:
-
可扩展:增加新策略只需新增一个类,不影响原有代码(开闭原则)。
-
可维护:避免多重
if-else或switch判断。 -
灵活性:运行时可替换算法。
二. C++示例代码
模拟一个支付系统,支持支付宝、微信支付和信用卡支付三种策略,运行时可自由切换。
#include <iostream>
#include <memory>
#include <string>
// 策略接口
class PaymentStrategy {
public:
virtual ~PaymentStrategy() = default;
virtual void pay(double amount) const = 0;
};
// 具体策略1 - 支付宝
class AlipayStrategy : public PaymentStrategy {
public:
void pay(double amount) const override {
std::cout << "[Alipay] Paid " << amount << " CNY.\n";
}
};
// 具体策略2 - 微信支付
class WeChatPayStrategy : public PaymentStrategy {
public:
void pay(double amount) const override {
std::cout << "[WeChat Pay] Paid " << amount << " CNY.\n";
}
};
// 具体策略3 - 信用卡
class CreditCardStrategy : public PaymentStrategy {
public:
void pay(double amount) const override {
std::cout << "[Credit Card] Paid " << amount << " CNY.\n";
}
};
// 上下文类(持有策略对象)
class PaymentContext {
private:
std::unique_ptr<PaymentStrategy> strategy;
public:
void setStrategy(std::unique_ptr<PaymentStrategy> s) {
strategy = std::move(s);
}
void checkout(double amount) const {
if (strategy) {
strategy->pay(amount);
} else {
std::cout << "No payment strategy set.\n";
}
}
};
// 测试
int main() {
PaymentContext context;
// 使用支付宝支付
context.setStrategy(std::make_unique<AlipayStrategy>());
context.checkout(100);
// 切换为微信支付
context.setStrategy(std::make_unique<WeChatPayStrategy>());
context.checkout(200);
// 切换为信用卡支付
context.setStrategy(std::make_unique<CreditCardStrategy>());
context.checkout(500);
return 0;
}
运行结果:
[Alipay] Paid 100 CNY.
[WeChat Pay] Paid 200 CNY.
[Credit Card] Paid 500 CNY.
三.关键点解析
1.例子的解析

-
策略接口
PaymentStrategy定义统一的pay()接口,确保不同支付方式可互换。 -
具体策略类
AlipayStrategy、WeChatPayStrategy、CreditCardStrategy实现不同算法逻辑。 -
上下文类
PaymentContext持有一个PaymentStrategy对象,并在运行时替换它。 -
使用
自动管理策略对象生命周期,避免手动释放内存。unique_ptr -
运行时切换策略
setStrategy()可以在执行时改变行为,而不需要修改上下文代
2. 关键技术解析
其实这些所谓的设计模式,核心 都是 基于C++提供的纯虚函数来实现的,纯虚函数定义了接口,子类实现功能。 父类指针 (或引用) 指向子类对象时,通过虚函数机制(动态绑定) 调用实际子类的方法。
Note:
在C++中,只有通过 父类的指针或引用 调用, 才能触发运行时多态(动态绑定)。
如果用父类对象本身来调用,会发生对象切片(Object Slicing),多态失效。
1579

被折叠的 条评论
为什么被折叠?



