怎样在C++中使用策略模式?

来源:站长查询作者:天穹小白头衔:草根站长
导读:本期聚焦于小伙伴创作的《怎样在C++中使用策略模式?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《怎样在C++中使用策略模式?》有用,将其分享出去将是对创作者最好的鼓励。

在C++项目里,策略模式常用于把容易变化的业务规则从主流程中抽离出来。它定义一个算法家族,分别封装起来,让它们之间可以互相替换,使算法的变化不会影响使用算法的客户。

怎样在C++中使用策略模式?

什么是策略模式

策略模式包含三个核心角色:策略接口、具体策略类和上下文类。策略接口声明算法方法;具体策略实现不同算法;上下文持有策略对象并调用其方法。

怎样在C++中实现策略模式

1. 定义策略接口

使用纯虚函数定义统一的行为接口,具体策略在此基础上实现各自逻辑。

// 策略接口:计算折扣
class DiscountStrategy {
public:
    virtual ~DiscountStrategy() = default;
    virtual double calc(double price) const = 0;
};

2. 实现具体策略

每个具体策略对应一种算法,互相独立,方便增删。

// 无折扣策略
class NoDiscount : public DiscountStrategy {
public:
    double calc(double price) const override {
        return price;
    }
};

// 满减折扣策略
class FullReduction : public DiscountStrategy {
public:
    double calc(double price) const override {
        if (price >= 100) return price - 20;
        return price;
    }
};

3. 上下文类使用策略

上下文不直接实现算法,而是委托给持有的策略对象,可在运行时更换。

class Order {
    DiscountStrategy* strategy;
public:
    Order(DiscountStrategy* s) : strategy(s) {}
    void setStrategy(DiscountStrategy* s) {
        strategy = s;
    }
    double finalPrice(double price) {
        return strategy->calc(price);
    }
};

4. 客户端调用示例

下面演示怎样在main函数中切换不同策略。

#include <iostream>

int main() {
    NoDiscount nd;
    FullReduction fr;

    Order order(&nd);
    std::cout << order.finalPrice(80) << std::endl;

    order.setStrategy(&fr);
    std::cout << order.finalPrice(120) << std::endl;

    return 0;
}

使用策略模式的注意点

  • 如果策略很多且差别小,可能产生类膨胀,可配合工厂模式管理。
  • 在C++中注意策略对象的生命周期,避免悬空指针,可用智能指针替代原始指针。
  • 当算法几乎不变时,不必强行使用策略模式,以免增加复杂度。

总结

在C++中使用策略模式,核心是通过抽象接口隔离变化,让上下文依赖抽象而非具体实现。合理运用能显著提升代码可维护性与扩展能力。

策略模式C++设计模式修改时间:2026-07-27 13:03:19

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。