详解设计模式 策略模式

1,815 阅读3分钟

策略模式

策略模式属于行为型模式

定义: 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换

在系统中提供一组策略,并将每个策略封装成类,使他们可以相互转换,具体策略的选择由客户端决定,这就是策略模式,当系统中有很多if…else的时候可以考虑使用策略模式,策略模式可以灵活的增加策略类,进行扩展,但是可能会由于策略过多导致,策略类太多

模式类图

角色

  1. 策略接口:TripStrategy
  2. 具体策略类:BicycleTripStrategyCarTripStraregy实现了策略接口的具体策略类
  3. 封装策略类:TripContext,使用某种策略的类

优点

  1. 算法可以自由切换
  2. 避免使用多重条件判断
  3. 扩展性良好,增加一种策略只需要新增一个策略类

缺点

  1. 策略类数量增多,每新增一种策略,就需要增加一个策略类
  2. 所有的策略类都需要对外暴露,上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,违法迪米特法则

模式代码实现

源码地址:https://github.com/mingyuHub/design-patterns

策略接口
/**
 * @author: chenmingyu
 * @date: 2019/2/21 18:15
 * @description: 出行策略
 */

public interface TripStrategy {

    /**
     * 出行方式
     */

    void tripMode();
}
具体策略类

自行车出行策略类

/**
 * @author: chenmingyu
 * @date: 2019/2/21 18:19
 * @description: 自行车出行策略类
 */

public class BicycleTripStrategy implements TripStrategy{

    @Override
    public void tripMode() {
        System.out.println("选择骑自行车出行");
    }
}
开车出行策略类
/**
 * @author: chenmingyu
 * @date: 2019/2/21 18:21
 * @description: 开车出行策略类
 */

public class CarTripStraregy implements TripStrategy {

    @Override
    public void tripMode() {
        System.out.println("选择开车出行");
    }
}
封装策略类
/**
 * @author: chenmingyu
 * @date: 2019/2/21 18:22
 * @description: 策略context
 */

public class TripContext {

    /**
     * 出行策略
     */

    private TripStrategy tripStrategy;

    public TripContext(TripStrategy tripStrategy) {
        this.tripStrategy = tripStrategy;
    }

    /**
     * 选择出行策略
     */

    public void chooseTripMode(){
        this.tripStrategy.tripMode();
    }
}
验证
public static void main(String[] args) {

    TripContext tripContext = new TripContext(new BicycleTripStrategy());
    tripContext.chooseTripMode();
    System.out.println("换一种出行方案");
    tripContext = new TripContext(new CarTripStraregy());
    tripContext.chooseTripMode();
}
输出
选择骑自行车出行
换一种出行方案
选择开车出行

如果系统中的一个策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题,否则日后的系统维护就会非常困难