策略模式(Strategy Pattern)

策略模式  解决的是  对象的行为变化问题,封装可替换的行为。 关注点是 如何实现算法或行为

一. 策略模式简介

策略模式:  

定义一组可互换的算法, 将每个算法封装起来,使它们可以互相替换,并让算法的变化独立于使用算法的客户。

其实,就是多态的一种典型的用法。

优点:

  • 可扩展:增加新策略只需新增一个类,不影响原有代码(开闭原则)。

  • 可维护:避免多重 if-elseswitch 判断。

  • 灵活性:运行时可替换算法。

二. 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() 接口,确保不同支付方式可互换。
  • 具体策略类

    AlipayStrategyWeChatPayStrategyCreditCardStrategy 实现不同算法逻辑。
  • 上下文类

    PaymentContext 持有一个 PaymentStrategy 对象,并在运行时替换它。
  • 使用 unique_ptr

    自动管理策略对象生命周期,避免手动释放内存。
  • 运行时切换策略

    setStrategy() 可以在执行时改变行为,而不需要修改上下文代

2. 关键技术解析

其实这些所谓的设计模式,核心 都是 基于C++提供的纯虚函数来实现的,纯虚函数定义了接口,子类实现功能。 父类指针 (或引用) 指向子类对象时,通过虚函数机制(动态绑定) 调用实际子类的方法。

Note:

在C++中,只有通过 父类的指针或引用  调用, 才能触发运行时多态(动态绑定)

如果用父类对象本身来调用,会发生对象切片(Object Slicing),多态失效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值