一、對象模式所屬類別簡介-組件協作模式
組件協作模式包含以下三種:
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可能會有大量代碼段被加載,但是無用。