23种设计模式-策略模式

定义:策略模式提供了一系列的算法,并将每一个算法封装起来,而且使他们还可以互相替换。策略模式让算法独立于使用它的客户而独立变化。
使用场景:
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种设计模式-策略模式)