10、跟学23种设计模式(C++版):策略模式

策略模式(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天

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: