
策略模式(Strategy Pattern)是C++中常用的行为型设计模式之一,它允许在运行时动态选择算法或行为。核心思想是将算法的实现与使用算法的类解耦,通过多态机制实现不同策略的自由切换。
策略模式的基本结构
策略模式包含三个主要角色:
策略接口(Strategy):定义所有支持算法的公共接口,通常是一个抽象基类或纯虚函数类。具体策略(Concrete Strategy):实现策略接口的具体类,每个类封装一种算法。上下文(Context):持有策略对象的引用或指针,调用策略接口执行算法,可在运行时更换策略。
下面是一个简单的C++实现示例:
// 策略接口class Strategy {public:virtual ~Strategy() = default;virtual void execute() const = 0;};
// 具体策略Aclass ConcreteStrategyA : public Strategy {public:void execute() const override {std::cout
// 具体策略Bclass ConcreteStrategyB : public Strategy {public:void execute() const override {std::cout
// 上下文类class Context {private:Strategy* strategy_;
public:explicit Context(Strategy* strategy) : strategy_(strategy) {}
void setStrategy(Strategy* strategy) { strategy_ = strategy;}void performAction() const { if (strategy_) { strategy_->execute(); }}
};
立即学习“C++免费学习笔记(深入)”;
实际应用场景
策略模式适用于以下情况:
有多个相似类,仅行为不同,比如排序、支付方式、日志记录方式等。需要在运行时动态切换算法,避免使用大量条件判断语句(如if-else或switch)。希望对用户隐藏算法细节,只暴露接口。
例如,在一个支付系统中,可以定义不同的支付策略:
class PaymentStrategy {public: virtual ~PaymentStrategy() = default; virtual void pay(int amount) const = 0;};
class CreditCardPayment : public PaymentStrategy {public:void pay(int amount) const override {std::cout
class AlipayPayment : public PaymentStrategy {public:void pay(int amount) const override {std::cout 支付宝支付: ”
class ShoppingCart {private:PaymentStrategy strategy_;public:void setPaymentMethod(PaymentStrategy s) {strategy = s;}void checkout(int amount) {strategy->pay(amount);}};
这样,购物车无需关心具体支付方式,只需调用统一接口即可。
使用现代C++优化策略模式
传统策略模式依赖继承和指针,但C++11以后可以用更灵活的方式实现,比如使用std::function和lambda表达式:
#include #include iostream>
class ContextModern {private:std::function strategy_;
public:void setStrategy(std::function strategy) {strategy_ = strategy;}
void execute() const { if (strategy_) strategy_();}
};
// 使用示例ContextModern ctx;ctx.setStrategy([]{ std::cout
这种方式更加简洁,适合轻量级策略或临时逻辑,避免类膨胀。
基本上就这些。策略模式通过分离算法与使用逻辑,提升了代码的可维护性和扩展性,是C++中处理多态行为的有力工具。合理使用,能让程序更清晰、更灵活。
以上就是C++怎么实现策略设计模式_C++行为型模式与Strategy Pattern应用的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1485044.html
微信扫一扫
支付宝扫一扫