设计模式 --- 策略模式

1.定义

策略模式定义了一系列算法,并将每个算法封装起来,而且使他们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

2.使用场景

1) 针对同一类型问题的多种处理方式,仅仅是具体行为有差别。

2) 需要安全地封装多种同一类型的操作时。

3) 出现同一抽象类有多个子类,又需要使用 if..elss 或者 switch...case  来选择具体子类。

3.简单实现

以地铁公交车计算出行成本价格为例。

//出行成本计算接口
interface CalculateStrategy{
    int calculatePrice(int km);
}

//公交车价格计算策略
class BusStrategy implements CalculateStrategy{
    //十公里以内1元,超过十公里之后加1元可坐5公里
    @Override
    public int calculatePrice(int km) {
        //超过距离为5的倍数
        int extFactor = (km - 10) / 5;
        //超过距离取余
        int fraction = (km - 10) % 5;
        //计算超出距离的价格
        int price = 1 + extFactor * 1;
        int extPri = fraction > 0 ? ++price : price ;
        return   km <= 10 ? 1 : extPri;

    }
}

//地铁价格计算策略
class SubwayStrategy implements CalculateStrategy{

    //6公里以内3元,6到12公里4元,12到22公里5元,22到32公里6元,其他7元。
    @Override
    public int calculatePrice(int km) {
        if (km <= 6){
            return 3;
        }else if (km > 6 && km <= 12){
            return 4;
        }else if (km > 12 && km <= 22){
            return 5;
        }else if (km > 22 && km <= 32){
            return 6;
        }
        return 7;
    }
}

public class StrategyMode {
    CalculateStrategy mStrategy;

    public void setStrategy(CalculateStrategy calculateStrategy){
        mStrategy = calculateStrategy;
    }

    public int calculatePrice(int km){
        return mStrategy.calculatePrice(km);
    }

    public static void  main(String[] args){
        StrategyMode strategyMode = new StrategyMode();
        //设置公交车价格策略
        strategyMode.setStrategy(new BusStrategy());
        System.out.println("乘坐16km公交车价格:" + strategyMode.calculatePrice(16) );

        //设置地铁出行策略
        strategyMode.setStrategy(new SubwayStrategy());
        System.out.println("乘坐16km地铁价格:" + strategyMode.calculatePrice(16));

    }
}

输出:

策略模式隐藏实现的同时拓展性也变得很强,例如添加一个出租车出行价格计算。

//出租车价格策略
class TaxiStrategy implements CalculateStrategy{
    // 简单规则为 一公里2元
    @Override
    public int calculatePrice(int km) {
        return km * 2;
    }
}
public class StrategyMode {
    CalculateStrategy mStrategy;

    public void setStrategy(CalculateStrategy calculateStrategy){
        mStrategy = calculateStrategy;
    }

    public int calculatePrice(int km){
        return mStrategy.calculatePrice(km);
    }

    public static void  main(String[] args){
        StrategyMode strategyMode = new StrategyMode();
        //设置公交车价格策略
        strategyMode.setStrategy(new BusStrategy());
        System.out.println("乘坐16km公交车价格:" + strategyMode.calculatePrice(16) );

        //设置地铁出行策略
        strategyMode.setStrategy(new SubwayStrategy());
        System.out.println("乘坐16km地铁价格:" + strategyMode.calculatePrice(16));

        //设置出租车价格
        strategyMode.setStrategy(new TaxiStrategy());
        System.out.println("乘坐16km出租车价格:" + strategyMode.calculatePrice(16));

    }
}

输出:

4.小结

优点:

1.结构清晰,使用简单直观;

2.耦合度相对较低,拓展方便;

3.操作封装更为彻底,数据更为安全。

缺点:

随着策略增加,子类会变得繁多。

猜你喜欢

转载自blog.csdn.net/huxing0215/article/details/84245549
今日推荐