C++设计者模式——策略模式

策略模式:某些对象使用的算法可能多种多样,经常改变,如果将这些算法编码到代码中,会使代码变得异常负责,而且有时候支持不使用的算法可能是一种性能负担。

对于上面描述可以举如下的列子解释。比如如下代码所示:

#pragma once
#include<iostream>
using namespace std;
//假如我们要实现一个功能:输入某个国家可以相应计算出该国家的税金;
enum TAX_BASE 
{
	CN_TAX,
	AME_TAX,
	JAP_TAX,
	JERM_TAX
};
/*1、如果需要新加德国的税金,则enum总需要改
2、客户端程序也需要增加一个else if分支;
3、并且对程序性能也有影响,因为他要一个个if判断过去,如果你给的是Jermany,那么他只能判断到最后一个;
4、如果emun 和 SalesOrder放在不同的文件夹下,那这俩个文件夹都需要被编译;
*/
class SalesOrder
{
public:
	double CalculateTax()
	{
		if (CN_TAX == tax)
		{
			//...//
			cout << "Calculate China tax" << endl;
		}
		else if (AME_TAX == tax)
		{
			cout << "Calculate America tax " << endl;
		}
		else if (JAP_TAX == tax)
		{
			cout << "Calculate Japan tax" << endl;
		}
		else if (JERM_TAX == tax)
		{
			cout << "Calculate Jermany tax" << endl;
		}


	}
private:
	TAX_BASE tax;
};

策略模式的实现:

#pragma once
#include<iostream>

using namespace std;
//基类
class TaxCalFactory
{
public:
	virtual double CalculateTax() = 0;
};
class CN_TAX :public TaxCalFactory
{
public:
	double CalculateTax()
	{
		cout << "Calculate China Tax" << endl;
		return 0;
	}
};
class AME_TAX :public TaxCalFactory
{
public:
	double CalculateTax()
	{
		cout << "Calculate America Tax" << endl;
		return 0;
	}
};
//在该模式下,不管他要计算哪个国家的税率(比如Jermany)只需要在加一个class Jermany_tax,继承TaxCalFactory,overwrite  CalculateTax函数即可。
//就不需要改客户端程序SalesOrder;
//也符合开闭原则;对拓展开放,对修改关闭比如这里对SalesOrder的修改应该关闭,对新增的Jermany_tax开放
class SalesOrder
{
public:
	SalesOrder(TaxCalFactory* taxcal) :taxcal(taxcal)
	{}
public:
	double CalculateTax()
	{
		taxcal->CalculateTax();
	}
private:
	TaxCalFactory* taxcal;
};

策略模式可以用在有多种算法,并且需要if 或者case来判断的情况下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值