UML

code
#pragma once
#define DISCOUNT 0.5
class CashBase
{
public:
virtual double getCash(double price, int num) = 0;
};
class CashNormal : public CashBase
{
public:
double getCash(double price, int num) override
{
return price * num;
}
private:
};
class CashDiscount : public CashBase
{
public:
CashDiscount(double discount)
{
this->discount = discount;
}
double getCash(double price, int num) override
{
return price * num * this->discount;
}
private:
double discount;
};
class CashReturn : public CashBase
{
public:
CashReturn(double moneyCondition, double moneyReturn)
{
this->moneyCondition = moneyCondition;
this->moneyReturn = moneyReturn;
}
double getCash(double price, int num) override
{
double res = price * num;
if (moneyCondition > 0 && res >= moneyCondition)
{
res -= moneyReturn * (res / moneyCondition);
}
return res;
}
private:
double moneyCondition;
double moneyReturn;
};
enum class CashType
{
Normal,
Discount,
Return
};
// 策略类:包含一个基类的指针,构造函数中做策略的选择,选择合适的对象赋值给基类指针,然后提供一个上层调用接口,去调用子类的重写函数
// 工厂类:提供一个全局的接口,根据传入的参数,返回最终的对象实例
class CashContext
{
public:
~CashContext() = default;
// 通过构造函数,传入具体的收费策略
CashContext(CashType type) : cashbase(nullptr)
{
switch (type)
{
case CashType::Normal:
this->cashbase = new CashNormal();
break;
case CashType::Discount:
this->cashbase = new CashDiscount(DISCOUNT);
break;
case CashType::Return:
this->cashbase = new CashReturn(500, 100);
break;
default:
break;
}
}
double getCash(double price, int num)
{
return this->cashbase->getCash(price, num);
}
private:
CashBase* cashbase;
};```