广州网站建设与实验,电脑手机自适应网站的建设,百度推广交了钱不给做网站,启动wordpress linux前言
在软件构建过程中#xff0c;某些对象使用的算法可能多种多样#xff0c;经常改变#xff0c;如果将这些算法都写在对象中#xff0c;将会使对象变得异常复杂#xff1b;而且有时候支持不频繁使用的算法也是一个性能负担。
如何在运行时根据需要透明地更改对象的算…前言
在软件构建过程中某些对象使用的算法可能多种多样经常改变如果将这些算法都写在对象中将会使对象变得异常复杂而且有时候支持不频繁使用的算法也是一个性能负担。
如何在运行时根据需要透明地更改对象的算法将对象和算法解耦
举例不同国家税率的计算新的需求是新增一个国家税率的计算。
不好的做法增加一个if else
好的做法定义一个新类扩展实现虚函数以此来实现不同的税率计算。
策略模式的定义
定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
策略模式结构 enum TaxBase {CN_Tax,US_Tax,DE_Tax,FR_Tax
};class SalesOrder{TaxBase tax;
public:double CalculateTax(){//...if (tax CN_Tax){//CN***********}else if (tax US_Tax){//US***********}else if (tax DE_Tax){//DE***********}else if (tax FR_Tax){ //...}//....}};
遵循开闭原则对扩展开放对修改关闭。 class TaxStrategy {
public:virtual double Calculate(const Context context)0;virtual ~TaxStrategy(){}
};class CNTax : public TaxStrategy {
public:virtual double Calculate(const Context context){//***********}
};class USTax : public TaxStrategy {
public:virtual double Calculate(const Context context){//***********}
};class DETax : public TaxStrategy {
public:virtual double Calculate(const Context context){//***********}
};// 扩展遵循开闭原则对扩展开放对修改关闭。
class FRTax : public TaxStrategy {
public:virtual double Calculate(const Context context){//.........}
};class SalesOrder {
private:TaxStrategy* strategy;public:SalesOrder(StrategyFactory* strategyFactory) {this-strategy strategyFactory-NewStrategy();}~SalesOrder(){delete this-strategy;}public double CalculateTax() {//...Context context();double val strategy-Calculate(context); //多态//...}};