注解实现策略模式

2022-12-13  本文已影响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));
    }

}
上一篇 下一篇

猜你喜欢

热点阅读