策略模式
策略模式属于行为型模式
定义: 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换
在系统中提供一组策略,并将每个策略封装成类,使他们可以相互转换,具体策略的选择由客户端决定,这就是策略模式,当系统中有很多if…else的时候可以考虑使用策略模式,策略模式可以灵活的增加策略类,进行扩展,但是可能会由于策略过多导致,策略类太多
模式类图
角色
- 策略接口:
TripStrategy
- 具体策略类:
BicycleTripStrategy
,CarTripStraregy
实现了策略接口的具体策略类 - 封装策略类:
TripContext
,使用某种策略的类
优点
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好,增加一种策略只需要新增一个策略类
缺点
- 策略类数量增多,每新增一种策略,就需要增加一个策略类
- 所有的策略类都需要对外暴露,上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,违法迪米特法则
模式代码实现
源码地址: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个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题,否则日后的系统维护就会非常困难