设计模式(三)——组件协作模式-strategy

一、对象模式所属类别简介-组件协作模式

组件协作模式包含以下三种:
TemplateMethod
Observer(event)
strategy

二、当前模式简介-strategy模式

策略模式strateg

三、需求

写一个实现德国、中国、美国各自不同税法计算的程序。

四、设计一

#include <iostream>
using namespace std;

enum TAXTYPE {
	CN_TAX,
	US_TAX,
	DE_TAX,
};

class SalesOrder
{
public:
	void CalcTax(TAXTYPE type)
	{
		if (type == CN_TAX) { std::cout << "cn_tax" << std::endl;}
		else if(type == US_TAX) { std::cout << "us_tax" << std::endl;}
		else if(type == DE_TAX) { std::cout << "de_tax" << std::endl;}
	}
};

int main()
{
	SalesOrder ob;
	ob.CalcTax(CN_TAX);
	return 0;
}
//打印
cn_tax

五、需求更改

(写一个实现德国、中国、美国各自不同税法计算的程序。)新增一个FC_TAX(法国)税法处理方式

设计一更改版本

#include <iostream>
using namespace std;

enum TAXTYPE {
	CN_TAX,
	US_TAX,
	DE_TAX,
	FC_TAX,//变化
};

class SalesOrder
{
public:
	void CalcTax(TAXTYPE type)
	{
		if (type == CN_TAX) { std::cout << "cn_tax" << std::endl;}
		else if(type == US_TAX) { std::cout << "us_tax" << std::endl;}
		else if(type == DE_TAX) { std::cout << "de_tax" << std::endl;}
		else if(type == FC_TAX) { std::cout << "fc_tax" << std::endl;} //变化
	}
};

int main()
{
	SalesOrder ob;
	ob.CalcTax(CN_TAX);
	return 0;
}

违反原则

1.新增时,违反原则2开闭-封闭原则,应该对扩展开放,SalesOrder的CalcTax需要改变,是一个变化点,变化点应该只扩展,而不是新增代码。

设计二

#include <iostream>
using namespace std;

class TaxStrategy
{
public:
	virtual ~TaxStrategy(){}
	virtual void CalcTax(int i) = 0;
};


class CNTax :public TaxStrategy
{
public:
	virtual ~CNTax(){}
	virtual void CalcTax(int i){ std::cout << "CNTax" << std::endl;};
};
class USTax :public TaxStrategy
{
public:
	virtual ~USTax(){}
	virtual void CalcTax(int i){ std::cout << "USTax" << std::endl;};
};

class DETax :public TaxStrategy
{
public:
	virtual ~DETax(){}
	virtual void CalcTax(int i){ std::cout << "DETax" << std::endl;};
};


class SalesOrder
{
public:
	void CalcTax(TaxStrategy *type)
	{
		type->CalcTax(1);
	}
};

int main()
{
	CNTax *cn = new CNTax();
	SalesOrder order;
	order.CalcTax(cn);
	return 0;
}

设计二更改版本

#include <iostream>
using namespace std;

class TaxStrategy
{
public:
	virtual ~TaxStrategy(){}
	virtual void CalcTax(int i) = 0;
};


class CNTax :public TaxStrategy
{
public:
	virtual ~CNTax(){}
	virtual void CalcTax(int i){ std::cout << "CNTax" << std::endl;};
};
class USTax :public TaxStrategy
{
public:
	virtual ~USTax(){}
	virtual void CalcTax(int i){ std::cout << "USTax" << std::endl;};
};

class DETax :public TaxStrategy
{
public:
	virtual ~DETax(){}
	virtual void CalcTax(int i){ std::cout << "DETax" << std::endl;};
};

class FCTax :public TaxStrategy
{
public:
	virtual ~FCTax(){}
	virtual void CalcTax(int i){ std::cout << "FCTax" << std::endl;};
};


class SalesOrder
{
public:
	void CalcTax(TaxStrategy *type)
	{
		type->CalcTax(1);
	}
};

int main()
{
	FCTax *cn = new FCTax();
	SalesOrder order;
	order.CalcTax(cn);
	return 0;
}
//打印FCTax 

设计二比设计一区别

1.区别:只新增类,而不去动其他的。如:SalesOrder不动。
2.新增时,一般该模式只放置一个方法(反正越少越好)

模式定义

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

模式结构

在这里插入图片描述

要点总结

1.大量if else(或者switch case)–》一般可使用strategy模式代替
2.如果if else绝对不变,就不要使用strategy。比如一周七天。
3.替换if else的一个原因是If else可能会有大量代码段被加载,但是无用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章