设计模式 策略者模式

概念

策略者模式也是一种组件协作模式

他的使用动机如下:

简单例子

假设一个编写一个类,根据不同的货币类型程序能够去运行不同的计算税的函数
一般的写法:

enum TaxBase{
    CN_Tax,
    US_Tax,
    DE_Tax,
    FR_Tax;
}
public class strategy1 {
    TaxBase tax=TaxBase.CN_Tax;
    public void CalculateTax(){
        switch (tax){
            case CN_Tax:
                //dosomething
                break;
            case US_Tax:
                //dosomething
                break;
            case DE_Tax:
                //dosomething
                break;
            case FR_Tax:
                //dosomething
                break;
        }
    }
}

上面的例子代码是一般通常的写法,但是假设未来需要添加对新的货币支持,这样的代码就必须在枚举和函数主体去进行修改。 违背了开放封闭原则。即类模块应该是可扩展的,但是不可修改。

采用策略者模式优化

abstract class TaxStrategy{
    abstract double CalculateTax();
}
class CN_Tax extends TaxStrategy{
    @Override
    double CalculateTax(Context context) {
        return 0;
    }
}
class US_Tax extends TaxStrategy{

    @Override
    double CalculateTax(Context context) {
        return 0;
    }
}
class DE_Tax extends TaxStrategy{
    @Override
    double CalculateTax(Context context) {
        return 0;
    }
}


public class strategy2 {
    TaxStrategy strategy=null;
    strategy2(StrategyFactory strategyFactory){
        strategy=strategyFactory.NewStrategy();
        //将这个对象赋值交给一个工厂处理
        //这是后面工厂模式的手段.
    }
    public double CalculateTax(Context context){
        return strategy.CalculateTax(Context context);//多态
    }
}

采用了多态的手段,之后如果要新添加算法就很轻松。

总结

如果代码出现了if else 机构,并且在未来的代码更新上可能要新加判断,这个时候就需要去考虑一下策略者模式了。

posted @ 2021-03-20 15:17  一个经常掉线的人  阅读(45)  评论(0)    收藏  举报