一、对象模式所属类别简介-组件协作模式
组件协作模式包含以下三种:
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可能会有大量代码段被加载,但是无用。