组件协作模式——策略模式

组件协作模式

现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚绑定,来实现框架与应用程序之间的松耦合,是二者协作时常用的模式
典型模式

  1. 模板方法
  2. 策略模式
  3. 观察者模式
动机

在软件的构造的过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变的异常复杂,而且有时候支持不经常使用的算法也是一种性能负担

模板定义

定义一系列算法,把他们一个个封装起来,并且使他们可以互相替换(变化),该模式使得算法可独立于使用他的客户端程序(稳定),而变化(扩展,子类化)
《组件协作模式——策略模式》

代码

遇到下面的情况,使用策略模式

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){   //更改
			//...
		}

        //....
     }
    
};

//当我们发现代码段出现大量的if else 时候其实就是一个信号
//我们其实也可也发现我们如果大量的使用了if else 我们就违背了开放封闭性原则,这样肯定是不对的

策略模式示范
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); //多态调用
        //...
    }
    
};
    原文作者:东东7_7
    原文地址: https://blog.csdn.net/dongdong7_77/article/details/109593829
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞