在review项目代码时候,看到很多if-else的代码,有一些类中,if-else太多了,严重影响代码的可读性和项目的扩展性。去掉if-else的方法有很多种,其中很重要的一个方法就是使用策略模式。
1.什么是策略模式
策略模式,英文全称是Strategy Design Pattern。在《设计模式》书中,它是这么定义的:
Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
中文意思:定义一组算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端。
2.策略模式的组成
策略模式包含三个部分,分别是策略的定义、策略的创建和策略的使用。具体分别如下:
2.1 策略的定义
策略类包含一个策略接口和一组实现这个接口的策略类。
public interface Strategy {
void run() throws Exception;
}
public class FastStrategy implements Strategy{
@Override
public void run() throws Exception {
System.out.println("快跑");
}
}
public class NormalStrategy implements Strategy{
@Override
public void run() throws Exception {
System.out.println("正常跑");
}
}
public class SlowStrategy implements Strategy{
@Override
public void run() throws Exception {
System.out.println("慢跑");
}
}
2.2 策略的创建和使用
策略模式定义里面包括一组策略,使用具体策略的时候,一般是通过类型来判断创建哪个策略来使用。创建一个工厂类,封装创建逻辑,具体策略对象放到一个Map中。具体实现代码如下:
public class StrategyFactory {
private static final Map<String,Strategy> strategies = new HashMap<>();
static {
strategies.put("Fast",new FastStrategy());
strategies.put("Normal",new NormalStrategy());
strategies.put("Slow",new SlowStrategy());
}
public static Strategy getStrategy(String type){
if(StringUtils.isEmpty(type)){
throw new IllegalArgumentException("type should not be empty");
}
return strategies.get(type);
}
策略模式包含一组可选策略,在使用的时候如何确定使用哪个策略,最常见的就是运行时动态确定使用哪种策略。
通过上面的代码,我们看到用Map缓存了策略,根据type直接从Map中获取相应的策略。
3.总结
通过策略模式的定义、创建和使用,我们大致了解了什么是策略模式,也能看出它的一些优缺点。
优点:
- 算法可以自由切换,改动策略很方便;
- 扩展性好,增加一个策略,增加一个策略实现类就可以。
缺点:
- 增加一个策略,除了实现对应的策略外,还需要在工厂中用Map来保存策略,新策略需要手动添加到Map中,
这个地方容易被忽略。需要掌握策略模式实现的每一步,切记落掉。
回到本文最开始的问题,按照本文的方法使用策略模式,就可以去掉项目代码中大量的if-else,这是策略模式一个重要的使用场景。