1. 策略模式

1. 第一步 定义一个接口

1
2
3
4
public interface Strategy {
String doScore(List<Integer> list) throws Exception;
}

2. 第二部定义一个注释类型

  • 通过@Target标签来定义作用范围,其参考值见类的定义:java.lang.annotation.ElementType
  • 通过@Retention标签来定义生命周期,其参考值见类的定义:java.lang.annotation.RetentionPolicy
  • 通过@Component标签,将其注入到Bean中,方便使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Component
    public @interface StrategyConfig {

    int appType();

    int strategy();

    }

3. 编写相对应的策略

  • 我这里写了两个策略。 具体调用那个策略是通过 @StrategyConfig(appType = 1, strategy = 1) 来决定的
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @StrategyConfig(appType = 1, strategy = 1)
    public class StrategyDemo01 implements Strategy{
    @Override
    public String doScore(List list) throws Exception {
    System.out.println("执行策略01");
    return null;
    }
    }

    @StrategyConfig(appType = 0, strategy = 1)
    public class StrategyDemo02 implements Strategy{

    @Override
    public String doScore(List list) throws Exception {
    System.out.println("执行策略02");
    return null;
    }
    }

4. 编写执行器

  • 通过@Resource注解来获取到所有的策略,因为两个策略模式都添加了@StrategyConfig 注解,又因为StrategyConfig注入到Bean中了,所以能获取到
  • 循环策略, 通过isAnnotationPresent来检查strategy是否拥有StrategyConfig注解
  • StrategyConfig是一个注解类型,所以通过getAnnotation这行代码获取strategy对象上StrategyConfig注解的实例
  • 依次判断appType参数是否与注解中的参数一致,一致的话则调用该策略
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    @Service
    public class StrategyExecutor {

    @Resource
    private List<Strategy> strategyList;

    public String doScore(List<Integer> list) throws Exception {
    for (Strategy strategy : strategyList) {
    if (strategy.getClass().isAnnotationPresent(StrategyConfig.class)){
    StrategyConfig annotation = strategy.getClass().getAnnotation(StrategyConfig.class);
    if (annotation.appType() == list.get(0)){
    return strategy.doScore(list);
    }
    }
    }
    throw new Exception("no strategy support");
    }
    }

最后

源代码在这里✈