C++ 设计模式 —— 21.策略模式

  • 策略模式:一种行为型设计模式

  • 应用场景:
    在GOF的《设计模式:可复用面向对象软件的基础》中是这样定义的:将一系列的算法一个个封装起来,并且使它们可相互替换。策略模式使得算法可独立于使用它的客户而变化。
    对于同一流程中不同的需求,对数据的处理算法可能会变更,所以将处理数据的算法单独抽离出去,形成一系列算法类,可以相互替换。

  • 举例:
    《大话设计模式》中举了一个很好的例子。
    商场经常会推出不同的优惠活动,对于结账流程来说,不同的优惠活动会使用不同的算法处理账单总额。
    所以抽离出一个算法的基类,提供统一的用于计算折后价的接口,然后所有的算法都在派生类中实现各自的方法。
    切换商场类中的算法指针所指向的算法类,即可切换调用的算法。

  • 实现方式:
    所有算法类派生自同一基类,实现统一的计算接口。
    商场类中使用成员指针指向具体的算法类,结账时通过该指针调用算法。


以下是策略模式的简单代码实现
#include <iostream>
using namespace std;

//策略基类
class Strategy
{
public:
    virtual float Calculate(float fTotal) = 0;
};

//策略A,打8折
class StrategyA:public Strategy
{
public:
    virtual float Calculate(float fTotal)
    {
        printf("优惠活动,全部8折\n");
        return fTotal * 0.8;
    }
};

//策略B,打7折
class StrategyB:public Strategy
{
public:
    virtual float Calculate(float fTotal)
    {
        printf("优惠活动,全部7折\n");
        return fTotal * 0.7;
    }
};

//策略C,满300减100
class StrategyC:public Strategy
{
public:
    virtual float Calculate(float fTotal)
    {
        printf("优惠活动,满300减100\n");
        float fFinal = fTotal - static_cast<int>(fTotal/300) * 100;
        return fFinal;
    }
};

//商场类
class Shop
{
public:
    Shop(Strategy* pStrategy = NULL):m_pStrategy(pStrategy){}
    ~Shop()
    {
        if(m_pStrategy)
        {
            delete m_pStrategy;
            m_pStrategy = NULL;
        }
    }

    //设置商场策略
    void SetStrategy(Strategy* pStrategy)
    {
        if(m_pStrategy)
        {
            delete m_pStrategy;
        }
        m_pStrategy = pStrategy;
    }

    //调用策略类的计算方法计算折后价
    void CalculatePay(float fTotal)
    {
        if(m_pStrategy)
        {
            float fFinal = m_pStrategy->Calculate(fTotal);
            printf("原价:%.2f元, 折后:%.2f元\n", fTotal, fFinal);
        }
        else
        {
            printf("无活动,总价:%.2f元\n", fTotal);
        }
    }

private:
    Strategy* m_pStrategy;
};
主函数中的使用
int main()
{
    Shop oShop;
    oShop.CalculatePay(400);

    oShop.SetStrategy(new StrategyA());
    oShop.CalculatePay(400);

    oShop.SetStrategy(new StrategyB());
    oShop.CalculatePay(400);

    oShop.SetStrategy(new StrategyC());
    oShop.CalculatePay(400);

    return 0;
}
控制台输出结果
无活动,总价:400.00元
优惠活动,全部8折
原价:400.00元, 折后:320.00元
优惠活动,全部7折
原价:400.00元, 折后:280.00元
优惠活动,满300减100
原价:400.00元, 折后:300.00元

如有错误,欢迎指正

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 3. 类设计者工具 3.1 拷贝控制 五种函数拷贝构造函数拷贝赋值运算符移动构造函数移动赋值运算符析构函数拷贝和移...
    王侦阅读 5,974评论 0 1
  • 二十三种设计模式 - 策略模式 策略模式简介 模式动机 完成一项任务,往往可以有多种不同的方式,每一种方式称为一个...
    JustTheSame阅读 5,811评论 2 16
  • C++类和对象 C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心...
    863cda997e42阅读 3,978评论 0 4
  • C++文件 例:从文件income. in中读入收入直到文件结束,并将收入和税金输出到文件tax. out。 检查...
    SeanC52111阅读 8,081评论 0 3
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,318评论 0 50

友情链接更多精彩内容