设计模式之二 策略模式

由于排版问题,访问 https://www.stdstring.com/2020/02/12/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E4%BA%8C%20%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F/获得更好的阅读体验。

使用 vs 没使用 策略模式

场景:有一套在线购物的收银系统,对于不同的国家,要采用不同的税法。但是随着生意的扩大,可能会支持更多的国家。如果不使用设计模式,要用很多的if-else语句,且在后期有其他国家的策略加进来之后,需要更改源代码。

使用策略模式:定义一个TaxStrategy基类,在类中定义一个纯虚函数Calculate(),用来计算应交的费用。对于不同的税法,各自继承一个子类,重写Calculate()方法即可实现所在国家的税法计算方法。

{% tabs 策略模式 %}

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); //多态调用
        //...
    }
    
};

{% endtabs %}

何时使用这种设计模式

需要在运行时根据需要透明地更改对象的算法,{% label warning @将算法与对象本身解耦 %}。

怎么来定义这种模式

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。
——《设计模式》 GoF

小结

  • Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。
  • Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。

由于排版问题,访问 https://www.stdstring.com/2020/02/12/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E4%BA%8C%20%E7%AD%96%E7%95%A5%E6%A8%A1%E5%BC%8F/获得更好的阅读体验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值