#include <iostream>
using namespace std;
class CashSuper
{
public:
virtual double acceptCash(double money) = 0;
};
class CashNormal: public CashSuper
{
public:
double acceptCash(double money)
{
return money;
}
};
class CashRebate: public CashSuper
{
public:
CashRebate(double moneyRebate):m_moneyRebate(moneyRebate){}
double acceptCash(double money)
{
return money * m_moneyRebate;
}
private:
double m_moneyRebate;
};
class CashReturn: public CashSuper
{
public:
CashReturn(double moneyCondition, double moneyReturn):m_moneyCondition(moneyCondition), m_moneyReturn(moneyReturn){}
double acceptCash(double money)
{
double result = money;
if (money >= m_moneyCondition)
{
result = money - (int)(money / m_moneyCondition) * m_moneyReturn;
}
return result;
}
private:
double m_moneyCondition;
double m_moneyReturn;
};
class CashContext
{
public:
CashContext(int type):m_cs(NULL)
{
switch (type)
{
case 1:
m_cs = new CashNormal;
break;
case 2:
m_cs = new CashReturn(300, 100);
break;
case 3:
m_cs = new CashRebate(0.8);
break;
}
}
double GetResult(double money)
{
double result = -1;
if (m_cs)
result = m_cs->acceptCash(money);
return result;
}
private:
CashSuper * m_cs;
};
int main()
{
CashContext cc1(1);
cout << cc1.GetResult(389) << endl;
CashContext cc2(2);
cout << cc2.GetResult(602) << endl;
CashContext cc3(3);
cout << cc3.GetResult(389) << endl;
return 0;
}
策略模式
最新推荐文章于 2025-02-08 16:16:45 发布
本文介绍了一种使用设计模式实现折扣策略的方法。通过定义抽象基类CashSuper及其派生类CashNormal、CashRebate和CashReturn来模拟不同类型的折扣计算方式。CashContext类则负责根据类型选择具体的折扣策略并应用到实际的金额计算中。
2325

被折叠的 条评论
为什么被折叠?



