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代码段不需要装在到内存或者高级缓存(顺带的好处)。