注解实现策略模式

news/2024/10/17 21:22:36/

注解实现策略模式

        • 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));}}

http://www.ppmy.cn/news/1132042.html

相关文章

Java多态调用成员的特点

Java多态调用成员的特点

【并发编程】ThreadPoolExecutor任务提交与停止流程及底层实现【新手探索版】

文章目录 1. ThreadPoolExecutor任务提交2. 线程池状态[这部分是难点呀]2.1. addWorker添加worker线程2.2. 内部类Worker2.3. runWorker():执行任务2.4. getTask():获取任务2.5. processWorkerExit():worker线程退出 3.3. 关闭线程池3.3.1. shutdown方法3.3.2. shutdownNow方法…

Feign接口调用GET请求@RequestParam传参丢失

文章目录 问题现象排查解决GET加注解解决使用POST方式解决 时间戳传参失败 问题现象 项目使用的是Spring Cloud微服务&#xff0c;服务间调用使用的是Feign在一次服务调用时&#xff0c;发现GET传参丢失&#xff0c;没有传递过去任何参数加了RequestParam注解&#xff0c;发现…

ORA-01034: ORACLE not available?一文解决

1.情况描述 oracle用户sqlplus登陆数据库&#xff08;11gR2 单机asm&#xff09;&#xff0c;进去查询一些基本的视图发现报错 ORA-01034: ORACLE not available&#xff0c;详细如下 [oracleoomcserver db_1]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production…

Unity把UGUI再World模式下显示到相机最前方

Unity把UGUI再World模式下显示到相机最前方 通过脚本修改Shader 再VR里有时候要把3D的UI显示到相机最前方&#xff0c;加个UI相机会坏事&#xff0c;可以通过修改unity_GUIZTestMode来解决。 测试用例 测试用例如下&#xff1a; 场景包含一个红色的盒子&#xff0c;一个UI…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— Web APIs(三)

思维导图 全选案例 大按钮控制小按钮 小按钮控制大按钮 css伪类选择器checked <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><…

【C++】vector的介绍 | 常见接口的使用

目录 vector的介绍 常见接口 构造函数 尾插push_back() vector的遍历 1.用方括号下标 遍历&#xff1a; 2.调用at()来访问&#xff1a; 3.用迭代器遍历&#xff1a; 4.范围for遍历&#xff1a; vector的空间修改 vector增删查改 覆盖assign() 查找find() 插入ins…

算法练习8——有序三元组中的最大值

LeetCode 100088 有序三元组中的最大值 I LeetCode 100086 有序三元组中的最大值 II 给你一个下标从 0 开始的整数数组 nums 。 请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中&#xff0c;找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数&am…