ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式第四讲--Strategy 策略模式

2021-12-03 08:00:13  阅读:138  来源: 互联网

标签:... -- double Tax Strategy context TaxStrategy 设计模式 public


1. “组件协作”模式:

现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚绑定,来实现框架与应用程序之间的松耦合,是两者之间协作常用的模式。

典型模式

Template Method

Strategy

Observer/Even

 

2. 策略模式的动机

 

在软件构建过程中,某些对象使用的算法可能多种多样,经常改动,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。

 

 

 

如何在运行时根据需要透明的更改对象的算法?如何将算法与对象本身解耦,从而避免上述问题?

 

3.代码

enum TaxBase
{
	CN_Tax,
	US_Tax,
	DE_Tax,

	//新加
	FR_Tax

};


//税务计算
class SalesOrder
{
	TaxBase tax;

public:
	double CalculateTax()
	{
		//...
		if (tax == CN_Tax)
		{
			//CN.....
		}
		else if (tax == US_Tax)
		{
			//US...
		}
		else if (tax == DE_Tax)
		{
			//DE...
		}
		else if (tax == FR_Tax)          //新加, 违背了开放封闭原则,对扩展开放,对更改封闭。
		{
			//FR...
		}


		//...
	}
};

  

4. 使用策略模式,修改后的代码

class TaxStrategy
{
public:
	virtual double Calculate(const Context& context) = 0;
	virtual ~TaxStrategy(){}
};

class CNTax :public TaxStrategy
{
public:
	virtual double Calculate(const Context& context)
	{
		//...
	}
};

class USTax :public TaxStrategy
{
public:
	virtual double Calculate(const Context& context)
	{
		//...
	}
};

class DETax :public TaxStrategy
{
public:
	virtual double Calculate(const Context& context)
	{
		//...
	}
};

//新加    符合开放封闭原则,对扩展开放,对更改封闭。
//实际上这部分新添加的代码完全可以编译成dll的方式提供使用。
class FRTax :public TaxStrategy
{
public:
	virtual double Calculate(const Context& context)
	{
		//...
	}
};


class SalesOrder
{
private:
	TaxStrategy* strategy;

public:
	SalesOrder(StrategyFactory* strategyFactory)
	{
		this->strategy = strategyFactory->NewStrategy();
	}

	~SalesOrder()
	{
		delete this->strategy;
		this->strategy = nullptr;
	}

public:
	double CalculateTax()
	{
		//...
		Context context();

		double val = strategy->Calculate(context);    //多态调用

		//...
	}

};

 5. 设计模式中讲的复用性是二进制级别的复用性。并不是源代码片段级的复用。

 

6.Strategy模式定义

定义一些列的算法,把他们一个个封装起来,并且使他们可以互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。

 

7.结构

 

 

8. 要点总结

strategy及其子类为组件提供了一系列可重用的算法,从而可以使的类型在运行时方便的根据需要在各个算法之间进行切换。

 

strategy模式提供了用条件判断语句以外的另外一种选择,消除了条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常需要Strategy模式。

 

如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

 

标签:...,--,double,Tax,Strategy,context,TaxStrategy,设计模式,public
来源: https://www.cnblogs.com/xcxfury001blogs/p/15636376.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有