策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以在不影响客户端的情况下发生变化。这种模式的主要目的是通过封装算法,解耦算法的实现与使用,提供不同算法的灵活选择。
策略模式的组成部分
- 策略接口(Strategy Interface):定义了一个公共接口,所有具体策略类都需要实现这个接口。
- 具体策略类(Concrete Strategy Classes):实现了策略接口,提供具体的算法实现。
- 上下文类(Context Class):维护对某个策略对象的引用,并通过策略接口调用具体策略的方法。
策略模式的优点
- 简化了算法的交换:可以在运行时选择不同的算法,而不需要修改客户端代码。
- 避免多重条件语句:通过使用不同的策略类,避免了在客户端代码中使用大量的条件语句。
- 更好的扩展性:可以通过增加新的策略类来扩展新的算法,而无需修改现有代码。
策略模式的应用场景
- 需要在不同场合使用不同算法:例如,排序算法、压缩算法、搜索算法等。
- 算法在类中不稳定,可能会频繁改变:将算法抽象出来,可以更灵活地进行修改和扩展。
- 避免使用多重条件语句:通过使用策略模式,可以将不同的行为封装到独立的策略类中。
示例代码
以下是一个使用策略模式的示例。在这个示例中,我们有一个简单的支付系统,支持两种支付方式:信用卡支付和现金支付。
策略接口
#include <iostream>
#include <memory>
// 策略接口
class PaymentStrategy {
public:
virtual void pay(int amount) = 0;
virtual ~PaymentStrategy() = default;
};
具体策略类
// 具体策略类:信用卡支付
class CreditCardPayment : public PaymentStrategy {
public:
void pay(int amount) override {
std::cout << "Paid " << amount << " using Credit Card." << std::endl;
}
};
// 具体策略类:现金支付
class CashPayment : public PaymentStrategy {
public:
void pay(int amount) override {
std::cout << "Paid " << amount << " using Cash." << std::endl;
}
};
上下文类
// 上下文类
class PaymentContext {
private:
std::unique_ptr<PaymentStrategy> strategy;
public:
PaymentContext(std::unique_ptr<PaymentStrategy> strategy) : strategy(std::move(strategy)) {}
void executeStrategy(int amount) {
strategy->pay(amount);
}
};
使用策略模式
int main() {
// 使用信用卡支付
std::unique_ptr<PaymentStrategy> creditCardPayment = std::make_unique<CreditCardPayment>();
PaymentContext context(std::move(creditCardPayment));
context.executeStrategy(100);
// 更换为现金支付
std::unique_ptr<PaymentStrategy> cashPayment = std::make_unique<CashPayment>();
context = PaymentContext(std::move(cashPayment));
context.executeStrategy(200);
return 0;
}
运行结果
Paid 100 using Credit Card.
Paid 200 using Cash.
总结
策略模式通过定义一系列可互换的算法,并将它们封装到独立的策略类中,使得算法可以在运行时动态替换,提供了更灵活和可扩展的设计方案。策略模式有效地消除了算法的条件分支语句,使代码更加简洁和清晰。
标签:std,策略,接口,算法,模式,unique From: https://www.cnblogs.com/whcjob/p/18218377