策略模式
1. 策略模式
1. 第一步 定义一个接口
1 | public interface Strategy { |
2. 第二部定义一个注释类型
- 通过@Target标签来定义作用范围,其参考值见类的定义:java.lang.annotation.ElementType
- 通过@Retention标签来定义生命周期,其参考值见类的定义:java.lang.annotation.RetentionPolicy
- 通过@Component标签,将其注入到Bean中,方便使用
1
2
3
4
5
6
7
8
9
10
public 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
public class StrategyDemo01 implements Strategy{
public String doScore(List list) throws Exception {
System.out.println("执行策略01");
return null;
}
}
public class StrategyDemo02 implements Strategy{
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
public class StrategyExecutor {
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");
}
}
最后
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Li SanJin の 小窝!
评论