Catch

V1

2022/04/16阅读:39主题:全栈蓝

设计模式之策略模式

有人说策略模式的作用是避免 if-else 分支判断逻辑。实际上,这种认识是很片面的。策略模式主要的作用还是解耦策略的定义、创建和使用,控制代码的复杂度,让每个部分都不至于过于复杂、代码量过多。除此之外,对于复杂代码来说,策略模式还能让其满足开闭原则,添加新策略的时候,最小化、集中化代码改动,减少引入 bug 的风险。

定义

定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端(这里的客户端代指使用算法的代码)。

策略类的定义比较简单,包含一个策略接口和一组实现这个接口的策略类。因为所有的策略类都实现相同的接口,所以,客户端代码基于接口而非实现编程,可以灵活地替换不同的策略。

应用场景

  • 需要在不同情况下使用不同的策略(算法)
  • 对客户隐藏具体策略(算法)的实现细节,彼此完全独立

类图

下图中IdStrategyFactory工厂类和IdStrategy.Type枚举类并不是必须的。

类图
类图

代码实现

IdStrategy

public interface IdStrategy {

    String getId();

    public enum Type {
        UUID, SNOW_FLAKE;
    }

}

UuidStrategy

public class UuidStrategy implements IdStrategy {

    @Override
    public String getId() {
        return UUID.randomUUID().toString();
    }

}

SnowFlakeStrategy

public class SnowFlakeStrategy implements IdStrategy {

    @Override
    public String getId() {
        // 雪花算法...
        return "SnowFlakeId";
    }

}

IdStrategyFactory

public class IdStrategyFactory {

    private static Map<IdStrategy.Type, IdStrategy> strategyMap = new HashMap<>();

    static {
        strategyMap.put(IdStrategy.Type.UUID, new UuidStrategy());
        strategyMap.put(IdStrategy.Type.SNOW_FLAKE, new SnowFlakeStrategy());
    }

    public IdStrategy get(IdStrategy.Type type) {
        return strategyMap.get(type);
    }

}

Main

public class Main {

    public static void main(String[] args) {
        String id;
        IdStrategy strategy;

        strategy = new UuidStrategy();
        id = strategy.getId();
        System.out.println(id);

        strategy = new SnowFlakeStrategy();
        id = strategy.getId();
        System.out.println(id);

        // 结合工厂模式
        IdStrategyFactory factory = new IdStrategyFactory();

        strategy = factory.get(IdStrategy.Type.UUID);
        id = strategy.getId();
        System.out.println(id);

        strategy = factory.get(IdStrategy.Type.SNOW_FLAKE);
        id = strategy.getId();
        System.out.println(id);

    }

}

分类:

后端

标签:

后端

作者介绍

Catch
V1