Template、Strategy、Observor属于构件协作类型的设计模式。
motivation:某些对象使用的算法多种多样经常改变,如果这些对象都编码到对象中,将导致对象算法十分复杂;支持不使用的算法也是一种性能负担(封装算法,相互替换)。
key interface or class:
1.library或者framework—在框架或者类库中定义主流程,对变化的子类方法进行晚绑定;
2.application—调用者,实现变化的方法,调用主流程运行。
structure:

template codes:
//计算税额的场景
//初始实现
class SaleOrder{
TaxType tax;
public:
double calulateTax(){
if(tax==CNTax){
//...
}
else if(tax==DETax){
//...
}
else if(tax==ENTax){
//...
}
else{
//...
}
//...
}
};
//使设计模式重构
class TaxStrategy{
public:
virtual double calulateTax()=0; //算法的抽象方法
virtual ~TaxStrategy(){};
};
//在不同的算法中实现接口
class CNTax:public TaxStrategy{
public:
virtual double calulateTax(){
//实现CN税计算方法
}
};
class DETax:public TaxStrategy{
public:
virtual double calulateTax(){
//实现DE税计算方法
}
};
//调用
class SaleOrder{
TaxStrategy* taxStrategy;
public:
//根据税法的不同传入不同的算法类
SaleOrder(TaxStrategy* taxStrategy){
this->taxStrategy=taxStrategy;
}
double calulateTax(){
return taxStrategy->calulateTax();
}
}
summary:
1. strategy的子类提供了一系列可重用的算法,可以在运行时对算法进行切换;
2.消除条件语句判断进行解耦合,许多使用if语句的代码都可以使用stately模式进行重构;
3.if-else代码段不需要装在到内存或者高级缓存(顺带的好处)。
本文探讨了在面对多种算法且频繁变化的场景下,如何使用设计模式中的策略模式进行代码重构,以实现算法的解耦和动态切换,提高代码的可维护性和灵活性。
&spm=1001.2101.3001.5002&articleId=103216681&d=1&t=3&u=349184e5fc8040a1801e85e95d8fb52f)
1万+

被折叠的 条评论
为什么被折叠?



