策略模式c++版本

这是大话设计模式中的策略模式的c++版本

//策略模式
#include <iostream>
using namespace std;

enum Cash_type
{
    NORMALL_CASH = 0,
    RETURN_CASH = 1,
    DISCOUNT = 2,
};

//虚基类cashsuper
class CashSuper
{
public:
    //打折函数
    double virtual acceptCash(double money)=0;
    //虚析构函数
    virtual ~CashSuper(){};
};

//正常收费子类
class CashNormal :public CashSuper
{
public:
     double acceptCash(double money) override
     {
         //正常返回
         return money;
     }
};

//打折收费类
class CashRebate:public CashSuper
{
public:

    //打折收费
    CashRebate(double moneyRebate)
    {
        _moneyReabate = moneyRebate;
    }

    double acceptCash(double money) override
    {
        return money * _moneyReabate;
    }
private:
    double _moneyReabate = 0;
};

//返利收费,超过设定金额,全部的数值就加入返利计算
class CashReturn:public CashSuper
{
public:
    CashReturn(double moneyCondition,double moneyReturn)
    {
        _moneyCondition = moneyCondition;
        _moneyReturn = moneyReturn;
    }

    double acceptCash(double money) override
    {
        double result = money;
        if(money >= _moneyCondition)
        {
            result = money - (money/_moneyCondition) * _moneyReturn;
        }
        return result;
    }

private:
//返利条件
double _moneyCondition = 0; 
//返利数值
double _moneyReturn = 0;
};

//定义所有支持的算法的公共接口
class CashContext
{
public:
    double GetResult(double money)
    {
        return _cs->acceptCash(money);
    }
    //将工厂的对象实例化过程转移至此实现与工厂方法的结合
    CashContext(Cash_type type)
    {
        switch(type)
        {
            case NORMALL_CASH:
                _cs = new CashNormal();
                break;
            case RETURN_CASH:
                _cs = new CashReturn(300,100);
                break;
            case DISCOUNT:
                _cs = new CashRebate(0.8);
                break;

        }
    }
private:
    CashSuper *_cs;
};

int main()
{
    double cash = 500;
    //获取收费策略
    CashContext *csuper = new CashContext(RETURN_CASH);
    //将传入金额
    cout<<"在现有优惠策略下消费"<<cash<<",实际支付的金额是:"<<csuper->GetResult(cash)<<endl;
    return 0;
}

测试输出:
在现有优惠策略下消费500,实际支付的金额是:333.333

策略模式优点:
1.减少了算法类与使用算法类的耦合
2.有助于提取出算法中的公共功能
3.简化单元测试
缺点:
改变的成本比较大
转载请注明源地址:http://blog.csdn.net/clh01s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值