@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) public @interface TaxTypeAnnotation { String taxType(); }
定义对应策略的类型常量
public interface TaxStrategy { String OUTER_TAX_STRATEGY = "outer"; String INNER_TAX_STRATEGY = "inner"; double calc(long amount); }
定义对应实现类
@TaxTypeAnnotation(taxType = OUTER_TAX_STRATEGY) public class OuterTaxStrategy implements TaxStrategy{ @Override public double calc(long amount) { final double taxRate = 0.2; return amount / (1 + taxRate) * taxRate; } }
@TaxTypeAnnotation(taxType = INNER_TAX_STRATEGY) public class InnerTaxStrategy implements TaxStrategy{ @Override public double calc(long amount) { final double taxRate = 0.2; return amount * taxRate; } }
public class AnnotationTaxStrategyFactory { static Map<String,TaxStrategy> taxStrategyMap = new HashMap<>(8); static { registerTaxStrategy(); } /** * 通过map获取税策略,当增加新的税策略时无需修改代码,对修改封闭,对扩展开放,遵循开闭原则 * @param taxType */ public static TaxStrategy getTaxStrategy(String taxType) throws Exception { // 当增加新的税类型时,需要修改代码,同时增加圈复杂度 if (taxStrategyMap.containsKey(taxType)) { return taxStrategyMap.get(taxType); } else { throw new Exception("The tax type is not supported."); } } private static void registerTaxStrategy(){ //找寻包目录下所有带有TaxTypeAnnotation注解的类 Set<Class<?>> classSet = ClassUtil.scanPackageByAnnotation("strategy",TaxTypeAnnotation.class); Optional.ofNullable(classSet).get().stream().filter(clazz -> clazz.isAnnotationPresent(TaxTypeAnnotation.class)).forEach(clazz ->{ TaxTypeAnnotation taxTypeAnnotation = clazz.getAnnotation(TaxTypeAnnotation.class); try { taxStrategyMap.put(taxTypeAnnotation.taxType(),(TaxStrategy)clazz.newInstance()); } catch (InstantiationException | IllegalAccessException e) { e.printStackTrace(); } }); } }
相关推荐
spring3.0mvc自学教程ppt+注解教程+注解实例+springmybatis教程+项目实例+中文api 初学(自学)着的不二法定,从入门到项目实例深入学习(浅-深)
SpringMvc Spring Mybatis Maven 注解方式
spring+springMvc+MyBatis+注解
ssh2+注解OA系统ssh2+注解OA系统ssh2+注解OA系统ssh2+注解OA系统ssh2+注解OA系统
语句注解IF_ELSE语句
深入浅出Java注解(注解概述+注解的本质+反射注解信息+元注解+属性的数据类型及特别的属性:value和数组)
RPC框架+json+反射+注解annonation
JAVA设计模式--程序设计--反射--注解--泛型
sping+hiberate+注解项目配置
桶装矿泉水三菱程序+注解(FX1N-60MT).zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例桶装矿泉水三菱程序+注解(FX1N-60MT).zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例桶装...
springMVC+Mybatis+注解实例,带sql语句
4156注册表+注解注册表+注解注册表+注解
android超炫的图片浏览器(图 + 代码 + 注解)
研究三天的springmvc+hibernate+注解,看来注解可以很灵活的。做了增删改查带分页。希望能够帮到你!
struts+注解+jquery例子
ssh+aop+log4j+日志拦截器+注解
Spring mvc + Spring + Mybatis + 注解实例 + 项目实例 从入门到项目实战
Mybatis+注解轻松实现脱敏,如果后端技术使用java遇到需要脱敏的场景,可以使用本文档的技术实现,可以轻轻松松的完成数据的脱敏及加解密,轻松便捷,代码简单
将策略模式进行能力话,可作为jar包引入既可以使用...运用lambda表达式+策略模式+注解等知识点,提供给大家学习,也可将其优化并用于平台建设。对应博客:https://blog.csdn.net/lightj1996/article/details/103656673
C 黑白棋(c语言+源码+注解)有图有音乐。 黑白棋(c语言+源码+注解) 有图有音乐,一款不错的小软件,附带源码(含注解),易学易懂 c语言 游戏 源码