3. Strategy(策略模式)C++

3. Strategy(策略模式)C++

在这里插入图片描述
策略模式属于“组件协作”模式里的一种。

1. 动机

在这里插入图片描述

举个例子,我们假设一个场景,做一个税种的计算,一个跨国的税计算,除了涉及金额等,还需要考虑不同国家的纳税比例。

//第一种做法就是采用分而治之的方法,if-else语句或者是switch-case语句
enum TaxBase{
   
	CN_Tax,  //中国
	US_Tax,  //美国
	DE_Tax   //德国
};

class SalesOrder{
   
	TaxBase tax;
public:
	double CalculaterTax(){
   
		//...
		if(tax == CN_Tax){
   
			//...
		}else if(tax == US_Tax){
   
			//...
		}else if(tax == DE_Tax){
   
			//..
		}
		//...
	}
};

这个做法只要能解决问题,其实也无可厚非。不过,上面的条件判断语句,会有一个性能负担的情况,就是如果大多数情况下只计算德国的,那么 CalculaterTax() 的其他国家算法就都失效了,而且还要去对它继续判断。但从面向对象的角度,我们看代码,不要静态地看一个软件结构的设计,而是要动态地看,要有一个时间轴的概念,要考虑到未来的变化。就拿上面的例子来说,我们需要多考虑一下,有没有一种可能,未来会多增加日本、法国等替他国家税的计算呢。如果需要增加,上面的代码应该怎么变动呢。

//增加其他国家
enum TaxBase{
   
	CN_Tax,  //中国
	US_Tax,  //美国
	DE_Tax,  //德国
	FR_Tax   //变动,法国
};

class SalesOrder{
   
	TaxBase tax;
public:
	double CalculaterTax(){
   
		//...
		if(tax == CN_Tax){
   
			//...
		}else if(tax == US_Tax){
   
			//...
		}else if(tax == DE_Tax){
   
			//..
		}else if(tax == FR_Tax){
    //变动</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值