策略模式的定义
策略模式是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。
代码示例
抽象策略类 CashSuper:定义了一个纯虚函数 acceptCash,这个函数是所有具体策略类必须实现的。
class CashSuper
{
public:
virtual double acceptCash(double, int) = 0;
virtual ~CashSuper() {}
};
具体策略类 CashNormal, CashRebate, CashReturn:分别实现了正常收费、打折收费和满减收费的算法。
class CashNormal : public CashSuper
{
public:
double acceptCash(double price, int num) override
{
return price * num;
}
};
class CashRebate : public CashSuper
{
public:
double acceptCash(double price, int num) override
{
return price * num * m_rebate;
}
CashRebate(double rebate)
{
m_rebate = rebate;
}
private:
double m_rebate = 1;
};
class CashReturn : public CashSuper
{
public:
CashReturn(double condition, double returnMoney)
{
m_condition = condition;
m_returnMoney = returnMoney;
}
double acceptCash(double price, int num) override
{
double result = price * num;
if (m_condition > 0 && result >= m_condition)
{
result = result - (int(result / m_condition)) * m_returnMoney;
}
return result;
}
private:
double m_condition = 0;
double m_returnMoney = 0;
};
上下文类 CashContext:根据不同的收费类型初始化不同的收费策略,并通过调用策略对象的方法来执行具体的收费算法。
class CashContext
{
public:
CashContext(int type)
{
switch (type)
{
case 1:
cs = new CashNormal();
break;
case 2:
cs = new CashRebate(0.8);
break;
case 3:
cs = new CashRebate(0.7);
break;
case 4:
cs = new CashReturn(300, 100);
break;
}
}
double getResult(double price, int num)
{
return cs->acceptCash(price, num);
}
private:
CashSuper* cs;
};
主函数 main:测试代码,创建一个具体策略对象,通过上下文类调用具体策略的方法。
int main()
{
CashContext* cc = new CashContext(4);
double result = cc->getResult(84.8, 35);
std::cout << "收费金额:" << result << std::endl;
delete cc;
return 0;
}
总结
通过使用策略模式,可以在运行时选择不同的算法,从而使代码更加灵活和可扩展。添加新的收费策略时,只需实现一个新的具体策略类,并在上下文类中进行相应的修改,而不需要改变现有的客户代码。