美文网首页
23种设计模式-策略模式

23种设计模式-策略模式

作者: 王灵 | 来源:发表于2019-02-26 11:24 被阅读0次

    定义:策略模式提供了一系列的算法,并将每一个算法封装起来,而且使他们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化。
    使用场景:
    1、针对统一问题的多种处理方式,仅仅使具体行为有差别时。
    2、需要安全地封装多种同一类型的操作时。
    3、需要同一抽象类有多个子类,而又需要使用if-else或switch-case来选择具体子类时。
    工厂模式和策略模式的异同点。
    相同点:会存在继承同一抽象类的多个子类或实现同一接口的多个实现类。
    不同点:
    1、具体实现类的创建位置不同。工厂模式的具体对象在工厂类里创建。策略模式没有工厂类,具体对象在使用类创建。
    2、做重点不同。工厂模式重在创建。策略模式重在选择。

    下面使用一个公共出行的计价模型来学习策略模式的使用。

    public interface CalculateStrategy {
        /**
         * 按距离来计算价格
         * @param km
         * @return
         */
        int calculatePrice(int km);
    }
    
    /**
     * 公交车价格计算策略
     */
    public class BusStrategy implements CalculateStrategy {
        /**
         * 北京公交车,十公里之内1元,超过十公里之后每加一元钱可以乘5公里
         * @param km
         * @return
         */
        @Override
        public int calculatePrice(int km) {
            //超过十公里的总距离
            int extraTotal=km-10;
            //超过的距离是5公里的倍数
            int extraFactor=extraTotal/5;
            //超过的距离对5公里取于
            int fraction=extraTotal%5;
            //价格计算
            int price=1+extraFactor*1;
            return fraction>0?++price:price;
        }
    }
    
    /**
     * 地铁价格计算策略
     */
    public class SubwayStrategy implements CalculateStrategy {
        /**
         * 6公里(含)内3元;6~12公里(含)4元;12~22公里(含)5元;22~32公里(含)6元。
         *
         * @param km
         * @return
         */
        @Override
        public int calculatePrice(int km) {
            if (km <= 6) {
                return 3;
            } else if (km <= 12) {
                return 4;
            } else if (km <= 22) {
                return 5;
            } else if (km <= 32) {
                return 6;
            } else {
                return 7;
            }
    
        }
    }
    
    
    public class TranficCalculator {
       static CalculateStrategy mS;
        public static void main(String[] args) {
    //        TranficCalculator calculator = new TranficCalculator();
    //        //设置计算策略
    //        calculator.setStrategy(new BusStrategy());
    //        //计算价格
    //        Log.e("公交车乘16公里的价格:" + calculator.calculatePrice(16));
    
            mS=new BusStrategy();
            Log.e("公交车乘16公里的价格:" + mS.calculatePrice(16));
    
        }
    
    //    CalculateStrategy mStrategy;
    //
    //    public void setStrategy(CalculateStrategy mStrategy) {
    //        this.mStrategy = mStrategy;
    //    }
    //
    //    public int calculatePrice(int km) {
    //        return mStrategy.calculatePrice(km);
    //    }
    }
    

    如果需要增加出租车的计算策略

    /**
     * 出租车计算策略
     */
    public class TaxiStrategy implements CalculateStrategy {
        @Override
        public int calculatePrice(int km) {
            return km * 2;
        }
    }
    

    相关文章

      网友评论

          本文标题:23种设计模式-策略模式

          本文链接:https://www.haomeiwen.com/subject/vdboyqtx.html