设计模式之策略模式

来源:互联网 发布:4.5mm铅弹可淘宝 编辑:程序博客网 时间:2024/06/05 05:12

  • 策略模式
  • 策略模式的实现
  • 代码如下
    • 父类CashSuper
    • 子类CashNormalCashRebateCashReturn
    • 策略配置类CashContext

问题:对商场营销模式进行封装(正常,打折,返利)

策略模式

  1. 策略模式是对算法家族的封装,使得算法的变化,不会影响使用的算法。
  2. 如果说简单工厂模式是对类进行的封装,那策略模式,就是对行为进行了封装。
  3. 商场的营销场景:不同促销活动,其实质是同一类计费算法。

策略模式的实现

策略模式和简单工厂模式非常相似,其区别在与Factory类和StrategyContext类:
1. 工厂模式解决的是对象创建问题,所以Factory类需要返回一个对象;
2. 而策略模式是对行为的封装,关注的是行为导致的结果,所以StrategyContext类只需返回结果;
3. 工厂模式的核心是,==返回子类对象的静态方法==;
3. 策略模式中的StrategyContext类封装了一个父类引用,和调用父类的方法(该方法也是子类实现的方法);

代码如下

父类:CashSuper

public CashSuper{    public abstract double acceptCash(double money);}

子类:CashNormal、CashRebate、CashReturn

/**************************/public CashNormal{    public CahsNormal()    {    }    public double acceptCash(double money)    {        return money;    }}/**************************/public CashRebate{    private double moneyRebate =.8d;    public CashRebate()    {    }    public double accpetCash(double money)    {        return money*moneyRebate;    }    /*****getter and setter...*****/}/**************************/public CashReturn{    private double moneyCondition = 300d;    private double moneyReturn = 100d;    public CashReturn()    {    }    public double acceptCash(double money)    {        if(money >= moneyCondition)        {            return money - Math.floor(money/moneyCondition)*moneyReturn;        }        return money;    }    /*****getter and setter...*****/}

策略配置类:CashContext

pubic CashContext{    private CashSuper cs;    //利用反射避免了if或者switch逻辑    public CashContext(String className)    {        cs= Class.forName(className).newInstence();    }    public getCash(double money)    {        return cs.acceptCash(money);    }    /*****getter and setter...*****/}
原创粉丝点击