注解实现策略模式
-
-
-
- [1. 使用idea创建sprignboot项目](#1. 使用idea创建sprignboot项目)
- [2. 创建策略接口](#2. 创建策略接口)
- [3. 创建策略类型注解](#3. 创建策略类型注解)
- [4. 创建两个具体策略类](#4. 创建两个具体策略类)
- [5. 策略工厂类](#5. 策略工厂类)
- [6. 使用](#6. 使用)
-
-
1. 使用idea创建sprignboot项目
2. 创建策略接口
java
public interface Handler {
Double callPrice(Double price);
}
3. 创建策略类型注解
java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface HandlerType {
String type();
}
4. 创建两个具体策略类
java
@HandlerType(type = "vip")
@Service
public class VipHandler implements Handler{
@Override
public Double callPrice(Double price) {
return price*0.8;
}
}
java
@HandlerType(type="member")
@Service
public class MemberHandler implements Handler{
@Override
public Double callPrice(Double price) {
return price;
}
}
5. 策略工厂类
java
@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. 使用
java
@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));
}
}