策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。本模式使得算法可以在不影响客户端的情况下发生变化。
主要特点
1、 封装变化:将算法实现细节从使用它的代码中分离出来;
2、 易于扩展:增加新的算法实现时,只需添加新的策略类;
3、 避免使用多重条件语句:通过使用策略模式,可以减少条件语句的使用,提高代码的可维护性;
4、 策略独立:各个策略之间相互独立,互不影响;
适用场景
1、 多种算法:系统有许多类相似的算法,客户端需要能够灵活选择使用不同算法;
2、 算法变化频繁:算法的实现可能会频繁发生变化,使用策略模式可以使得这些变化对客户端代码透明;
3、 条件语句过多:系统中使用大量的条件语句来选择适当的行为时,可以使用策略模式来代替这些条件语句;
C++示例
我们以一个简单的支付系统为例,该系统支持不同的支付方式(如信用卡、PayPal、比特币)。通过使用策略模式,可以轻松地添加新的支付方式,而不会影响现有的代码。
#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 << "Paying " << amount << " using Credit Card." << std::endl;
}
};
// 具体策略类:PayPal支付
class PayPalPayment : public PaymentStrategy {
public:
void pay(int amount) override {
std::cout << "Paying " << amount << " using PayPal." << std::endl;
}
};
// 具体策略类:比特币支付
class BitcoinPayment : public PaymentStrategy {
public:
void pay(int amount) override {
std::cout << "Paying " << amount << " using Bitcoin." << std::endl;
}
};
// 上下文类
class PaymentContext {
private:
std::unique_ptr<PaymentStrategy> strategy;
public:
void setStrategy(std::unique_ptr<PaymentStrategy> newStrategy) {
strategy = std::move(newStrategy);
}
void pay(int amount) {
if (strategy) {
strategy->pay(amount);
} else {
std::cerr << "Payment strategy is not set." << std::endl;
}
}
};
int main() {
PaymentContext context;
context.setStrategy(std::make_unique<CreditCardPayment>());
context.pay(100);
context.setStrategy(std::make_unique<PayPalPayment>());
context.pay(200);
context.setStrategy(std::make_unique<BitcoinPayment>());
context.pay(300);
return 0;
}
在这个例子中,我们创建了一个支付系统,该系统可以使用不同的支付方式(信用卡、PayPal 和比特币)。通过使用策略模式,我们将支付方式的具体实现与支付上下文(PaymentContext
)分离开来,使得我们可以在运行时轻松地更改支付策略。这样,增加新的支付方式也变得非常简单,只需创建新的策略类并将其传递给上下文类即可
总结
策略模式通过将算法的实现从使用它们的代码中分离出来,实现了算法的可替换性和扩展性。它适用于系统中存在多种算法,且这些算法可能会发生变化的情况。通过使用策略模式,可以减少代码中的条件语句,增加系统的灵活性和可维护性。
END
今天是日更的第20/100天
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: