Java 自定义注解实现策略模式,优化 if else 代码

1.自定义注解,通过参数值定位实际要走的策略类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FinishStrategyType {

    String templetes();

}
2.创建策略类接口,通过多态调用的方式实现策略类模式
public interface FinishStrategy {
    Map<String, Object> execute();
}

3.创建策略类

    /**
     * templetes  可以设置逗号隔开的参数值,满足多条件判断 “1,2”
     */
    @Component
    @FinishStrategyType(templetes = '1,2')
    @Transactional
    public class EatFinishStrategy implements FinishStrategy {
        /**
         * 执行
         */
        @Override
        public void execute() {
            System.out.println("参数值1或者2执行这里");
        }
    }

    @Component
    @FinishStrategyType(templetes = '3')
    @Transactional
    public class SleepFinishStrategy implements FinishStrategy {
        /**
         * 执行
         */
        @Override
        public void execute() {
            System.out.println("参数值3执行这里");
        }
    }
4 调用策略模式执行具体的方法
    /**
     * 实际执行的策略类集合
     * 这里通过注解的方式注入,也可以通过其他方式注入
     */
    @Autowired
    private Map<String, FinishStrategy> strategyMap;

    /**
     * 根据自定义注解参数值重新封装策略类集合,参数值作为key
     *
     * @param finishStrategys
     */
    @Autowired
    public void setStrategyMap(List<FinishStrategy> finishStrategys) {
        strategyMap = finishStrategys.stream().collect(
                Collectors.toMap(t -> AnnotationUtils.findAnnotation(t.getClass(), FinishStrategyType.class).templetes(),
                        v -> v, (v1, v2) -> v1));
    }

    /**
     * 策略模式调用执行
     *
     * @param type 定位需要执行的策略类参数,值:“1”、“2”、"3"
     */
    public void running(String type) {

        //得到实际执行的策略类
        for (Map.Entry<String, FinishStrategy> entry : strategyMap.entrySet()) {
            // entry.getKey() 是策略类自定义注解的参数值,根据参数值得到实际执行的策略类
            String keys = entry.getKey();
            List<String> list = Arrays.asList(keys.split(","));
            if (list.contains(type)) {
                FinishStrategy finishStrategy = strategyMap.get(keys);
                finishStrategy.execute();
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值