策略模式(Strategy)

定义

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

本质

分离算法,选择实现。

登场角色

  • 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来选择具体的子类时。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。