策略模式

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;

///算法的基类
class CashSuper
{
public:
    ///算法的接口
    virtual double acceptCash(double money) = 0; 
};

class CashNormal : public CashSuper
{
public:
    virtual double acceptCash(double money)
    {
        return money;
    }
};

class CashRebate : public CashSuper
{
public:
    CashRebate(std::string moneyRebate)
    {
        moneyRebate = atof(moneyRebate.c_str());
    }
    virtual double acceptCash(double money)
    {
        return money * moneyRebate;
    }

private:
    double moneyRebate;
};

class CashReturn : public CashSuper
{
public:
    CashReturn(string Condition, string Return)
    {
        moneyCondition = atof(Condition.c_str());    
        moneyReturn = atof(Return.c_str());
///        cout << moneyCondition << "\t" << moneyReturn << endl;
    }

    virtual double acceptCash(double money)
    {
        double result = money;
        if (money >= moneyCondition)
        {
            result = money - (money / moneyCondition) * moneyReturn;
        }
        return result;
    }

private:
    double moneyCondition;
    double moneyReturn;
};

///策略的工厂类
class CashContext
{
public:
    CashContext(int type): cs(NULL)
    {
        ///具体的策略
        switch(type)
        {
        case 1:
            cs = new CashNormal();
            break;
        case 2:
            cs = new CashReturn("300", "100");
            break;
        case 3:
            cs = new CashRebate("0.8");
            break;
        }
    }

    ~CashContext()
    {
        if (cs)
        {
            delete cs;
        }
    }

    double GetResult(double money)
    {
        return cs->acceptCash(money);
    }

private:
    CashSuper* cs;
};

int main()
{
    CashContext c1(1);
    cout << c1.GetResult(600) << endl;

    CashContext c2(2);
    cout << c2.GetResult(600) << endl;

    CashContext c3(3);
    cout << c3.GetResult(600) << endl;

    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值