(二)策略模式

来源:互联网 发布:白梦妍 知乎 编辑:程序博客网 时间:2024/05/01 12:57

请见源码和注释:

#include "stdafx.h"#include <string>#include <iostream>#include <memory>//为了应用智能指针using namespace std;//策略模式:定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化//不会影响到使用算法的客户。// 下面这个例子展示的是商场收银系统,为了支持某商品可以支持多种活动,采用策略模式。//CSaleStrategy:销售策略的抽象类,用来模拟策略的抽象类//CDiscountStrategy、CReturnStrategy和CNormalStrategy:不同销售策略,用来代表不同的策略。//CCashContext:支付类,包含策略指针,用来模拟用户可以直接使用的类(上层抽象层)。class CSaleStrategy{public:    virtual ~CSaleStrategy(){}    //获得最终的支付价格,需要输入单价和数量    virtual double GetResult(double dPrice, int iCount) = 0;};//打折处理class CDiscountStrategy : public CSaleStrategy{public:    explicit CDiscountStrategy(double dDiscount) : m_dDiscount(dDiscount){}    double GetResult(double dPrice, int iCount)    {        return dPrice * m_dDiscount * iCount;//打折后总价    }private:    double m_dDiscount;//折扣};//满一定总价,返现class CReturnStrategy : public CSaleStrategy{public:    explicit CReturnStrategy(double dLevel, double dRet)        : m_dLevel(dLevel)        , m_dRet(dRet)    {    }    double GetResult(double dPrice, int iCount)    {        double dDeal = dPrice * iCount;        if (dDeal >= m_dLevel)        {            dDeal -= m_dRet;        }        return dDeal;    }private:    double m_dLevel;//返现的最低消费    double m_dRet;  //返现值};//按定价正常销售class CNormalStrategy : public CSaleStrategy{public:    double GetResult(double dPrice, int iCount)    {        return dPrice * iCount;    }};//收银类class CCashContext{private:    unique_ptr<CSaleStrategy> m_pStrag;//包含关系来实现策略内置public:    //根据活动类型(strStragType)来确定支付策略(与工厂模式相结合)    CCashContext(const string &strStragType) : m_pStrag(nullptr)     {        if ("正常收费" == strStragType)        {            m_pStrag = unique_ptr<CNormalStrategy>(new CNormalStrategy);        }        else if ("满300返100" == strStragType)        {            m_pStrag = unique_ptr<CReturnStrategy>(new CReturnStrategy(300, 100));        }        else if ("打8折" == strStragType)        {            m_pStrag = unique_ptr<CDiscountStrategy>(new CDiscountStrategy(0.8));        }        else        {            m_pStrag = nullptr;        }    }    double GetResult(double dPrice, int iCount)    {        return m_pStrag->GetResult(dPrice, iCount);//根据具体的策略来调用    }};int _tmain(int argc, _TCHAR* argv[]){    CCashContext cxt("打8折");    cout << cxt.GetResult(100, 1) << endl;    CCashContext cxt2("满300返100");    cout << cxt2.GetResult(100, 3) << endl;return 0;}

输出:

80
200
请按任意键继续. . .

0 0
原创粉丝点击