注解实现策略模式
- 1. 使用idea创建sprignboot项目
- 2. 创建策略接口
- 3. 创建策略类型注解
- 4. 创建两个具体策略类
- 5. 策略工厂类
- 6. 使用
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{@Overridepublic Double callPrice(Double price) {return price*0.8;}
}
@HandlerType(type="member")
@Service
public class MemberHandler implements Handler{@Overridepublic Double callPrice(Double price) {return price;}
}
5. 策略工厂类
@Component
public class HandlerFactory implements BeanFactoryPostProcessor {private static Map<String,Handler> handlerMap = new ConcurrentHashMap<>();@Overridepublic 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));}}