策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。策略模式使得算法可以在不影响客户端的情况下发生变化。这种模式的主要目的是通过封装算法,解耦算法的实现与使用,提供不同算法的灵活选择。

策略模式的组成部分

  1. 策略接口(Strategy Interface):定义了一个公共接口,所有具体策略类都需要实现这个接口。
  2. 具体策略类(Concrete Strategy Classes):实现了策略接口,提供具体的算法实现。
  3. 上下文类(Context Class):维护对某个策略对象的引用,并通过策略接口调用具体策略的方法。

策略模式的优点

  1. 简化了算法的交换:可以在运行时选择不同的算法,而不需要修改客户端代码。
  2. 避免多重条件语句:通过使用不同的策略类,避免了在客户端代码中使用大量的条件语句。
  3. 更好的扩展性:可以通过增加新的策略类来扩展新的算法,而无需修改现有代码。

策略模式的应用场景

  1. 需要在不同场合使用不同算法:例如,排序算法、压缩算法、搜索算法等。
  2. 算法在类中不稳定,可能会频繁改变:将算法抽象出来,可以更灵活地进行修改和扩展。
  3. 避免使用多重条件语句:通过使用策略模式,可以将不同的行为封装到独立的策略类中。

示例代码

以下是一个使用策略模式的示例。在这个示例中,我们有一个简单的支付系统,支持两种支付方式:信用卡支付和现金支付。

策略接口

#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.

总结

策略模式通过定义一系列可互换的算法,并将它们封装到独立的策略类中,使得算法可以在运行时动态替换,提供了更灵活和可扩展的设计方案。策略模式有效地消除了算法的条件分支语句,使代码更加简洁和清晰。

posted @ 2024-05-28 16:41  ponder776  阅读(8)  评论(0编辑  收藏  举报