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