美文网首页C++设计模式设计模式 BY C++
C++ 设计模式 —— 21.策略模式

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

作者: JeremyYv | 来源:发表于2020-01-16 13:36 被阅读0次
    • 策略模式:一种行为型设计模式

    • 应用场景:
      在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元
    

    如有错误,欢迎指正

    相关文章

      网友评论

        本文标题:C++ 设计模式 —— 21.策略模式

        本文链接:https://www.haomeiwen.com/subject/iyyfzctx.html