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

组件协作模式包含以下三种:
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可能会有大量代码段被加载,但是无用。

技术
©2019-2020 Toolsou All rights reserved,
Redis 计数器 高并发的应用pytorch之ResNet18(对cifar10数据进行分类准确度达到94%)在Vue中使用Web Worker函数基本定义和使用‘未完待续 如何建设数据安全体系?最优化方法总结:公式解、数值优化、求解思想c++内存 指针越界检测机制_CrtMemBlockHeadePython垃圾回收与内存泄露蚂蚁集团香港IPO获得中国证监会批准Keras保存与加载模型(JSON+HDF5)