設計模式(三)——組件協作模式-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可能會有大量代碼段被加載,但是無用。

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