代码优化之策略模式

在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 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.总结

通过策略模式的定义、创建和使用,我们大致了解了什么是策略模式,也能看出它的一些优缺点。
优点:

  1. 算法可以自由切换,改动策略很方便;
  2. 扩展性好,增加一个策略,增加一个策略实现类就可以。

缺点:

  1. 增加一个策略,除了实现对应的策略外,还需要在工厂中用Map来保存策略,新策略需要手动添加到Map中,
    这个地方容易被忽略。需要掌握策略模式实现的每一步,切记落掉。

回到本文最开始的问题,按照本文的方法使用策略模式,就可以去掉项目代码中大量的if-else,这是策略模式一个重要的使用场景。

你可能感兴趣的:(代码优化之策略模式)