#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;
}