美文网首页设计模式
策略模式(Strategy)

策略模式(Strategy)

作者: 秀儿2020 | 来源:发表于2020-07-20 15:50 被阅读0次

定义

定义一系列的算法,把他们一个个的封装起来,并且使他们可以互相替换,本模式使得算法可以独立于使用它的客户而变化。

本质

分离算法,选择实现。

登场角色

  • Strategy(策略)

    负责决定实现策略所必需的接口,用来约束一系列具体的策略算法。

  • ConcreteStrategy(具体的策略)

    实现具体的策略(战略、方向和算法等)。

  • Context(上下文)

    负责使用策略角色,保存了策略角色实例,并使用他去实现功能。

代码示例

/**
 * 策略,用来约束一系列具体的策略算法
 */
public interface CalculateStrategy {
    /**
     * 按照距离计算公里数
     * @param km
     * @return
     */
    int calculatePrice(int km);
}


/**
 * 公交车价格计算策略
 */
public class BusStrategy implements CalculateStrategy{
    @Override
    public int calculatePrice(int km) {
        /*
        这里是公交车价格计算策略的具体计算过程
        这里简单计算
         */
        return km * 1;
    }
}


/**
 * 地铁价格计算策略
 */
public class SubwayStrategy implements CalculateStrategy{
    @Override
    public int calculatePrice(int km) {
        /**
         * 这里是地铁价格计算策略
         */
        return km * 2;
    }
}

/**
 * 上下文,使用策略的角色
 */
public class TranficCalculator {
    CalculateStrategy mCalculateStrategy;
    public static void main(String[] args){
        TranficCalculator tranficCalculator = new TranficCalculator();
        tranficCalculator.setmCalculateStrategy(new BusStrategy());
        System.out.println("公交车价格计算");
        System.out.println(tranficCalculator.calculatePrice(3));

        tranficCalculator.setmCalculateStrategy(new SubwayStrategy());
        System.out.println("地铁价格计算");
        System.out.println(tranficCalculator.calculatePrice(3));
    }

    public void setmCalculateStrategy(CalculateStrategy mCalculateStrategy) {
        this.mCalculateStrategy = mCalculateStrategy;
    }

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

运行结果

公交车价格计算
3
地铁价格计算
6

优点

  • 定义一系列的算法,让这些算法可以互相替换。
  • 避免多重条件语句。
  • 更好的扩展性,扩展新的算法非常容易,只需要计算策略抽象类或者接口即可。

缺点

  • 使用时必须了解每种策略的不同。
  • 因为减少了条件语句,所以增加了对象的数量,因为其可以看成是对条件语句的拆分。

何时使用

  • 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时。
  • 需要安全的封装同一类型的多种操作时。
  • 出现同一个抽象类的多个子类,而又需要使用if-else或者switch-case来选择具体的子类时。

相关文章

网友评论

    本文标题:策略模式(Strategy)

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