美文网首页
注解实现策略模式

注解实现策略模式

作者: _郑_ | 来源:发表于2022-12-13 18:21 被阅读0次

    1. 使用idea创建sprignboot项目

    2. 创建策略接口

    public interface Handler {
    
        Double callPrice(Double price);
    
    }
    

    3. 创建策略类型注解

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    public @interface HandlerType {
    
        String type();
    }
    

    4. 创建两个具体策略类

    @HandlerType(type = "vip")
    @Service
    public class VipHandler implements Handler{
        @Override
        public Double callPrice(Double price) {
            return price*0.8;
        }
    }
    
    @HandlerType(type="member")
    @Service
    public class MemberHandler implements Handler{
        @Override
        public Double callPrice(Double price) {
            return price;
        }
    }
    

    5. 策略工厂类

    @Component
    public class HandlerFactory implements BeanFactoryPostProcessor {
    
        private static Map<String,Handler> handlerMap = new ConcurrentHashMap<>();
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            Map<String, Object> handlerBeans = beanFactory.getBeansWithAnnotation(HandlerType.class);
            Optional.ofNullable(handlerBeans).orElse(Collections.emptyMap())
                    .forEach((name,bean) -> {
                        Class<?> clazz = bean.getClass();
                        HandlerType handlerType = clazz.getAnnotation(HandlerType.class);
                        handlerMap.put(handlerType.type(), (Handler) bean);
                    });
    
        }
    
        public static Handler getHandler(String type){
            Handler handler = handlerMap.get(type);
            if (handler == null) {
                throw new RuntimeException("can not find handler");
            }
            return handler;
        }
    }
    

    6. 使用

    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
            Handler vip = HandlerFactory.getHandler("vip");
            System.out.println(vip.callPrice(1000.0));
        }
    
    }
    

    相关文章

      网友评论

          本文标题:注解实现策略模式

          本文链接:https://www.haomeiwen.com/subject/qddcqdtx.html