`
richand730
  • 浏览: 3478 次
社区版块
存档分类
最新评论

策略模式+注解去除多余if else

    博客分类:
  • java
 
阅读更多

1. 创建自定义注解 TaxTypeAnnotation

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface TaxTypeAnnotation {
    String taxType();
}

 

2. 创建策略类 TaxStrategy

定义对应策略的类型常量

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

 

3. 创建工厂类

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

 

分享到:
评论

相关推荐

    SpringMvc+Spring+Mybatis+Maven+注解方式=整合

    "SpringMvc+Spring+Mybatis+Maven+注解方式"是一个经典的Java后端技术栈,它整合了四个关键组件,为开发人员提供了强大的工具和框架支持。下面将详细讲解这四个组件及其整合方式。 1. **Spring Framework**: ...

    spring3.0mvc自学教程ppt+注解教程+注解实例+springmybatis教程+项目实例+中文api (老师的心血)从入门到项目实战

    它遵循模型-视图-控制器(MVC)设计模式,将业务逻辑、数据和用户界面分离,提高了代码的可维护性和测试性。 2. **注解教程**:Spring 3.0引入了大量的注解,如`@Controller`、`@RequestMapping`、`@Service`、`@...

    spring+springMvc+MyBatis+注解

    标题中的"spring+springMvc+MyBatis+注解"提到了四个关键点:Spring、SpringMVC、MyBatis以及注解。这四者构成了一个经典的Java Web开发框架组合,通常被称为SSM(Spring、SpringMVC、MyBatis)。下面将详细解释这些...

    语句注解IF_ELSE语句

    ### 语句注解IF_ELSE语句 #### 基础概念 在程序设计语言中,`if_else`语句是一种基本的控制结构,用于根据条件的不同来选择执行不同的代码块。它允许程序员根据特定的条件来决定程序的执行路径。`if_else`语句由`if...

    JAVA设计模式--程序设计--反射--注解--泛型

    设计模式包括创建型模式(如单例、工厂方法、抽象工厂等)、结构型模式(如适配器、装饰器、代理等)和行为型模式(如策略、观察者、职责链等)。这些模式提供了良好的可复用性和可扩展性,帮助开发者遵循“开闭原则...

    ssh2+注解OA系统

    SSH2+注解OA系统是一种基于Spring、Struts2和Hibernate三大开源框架构建的企业级办公自动化(Office Automation,简称OA)系统。这个系统的开发利用了SSH2(Spring、Struts2、Hibernate)的集成优势,提供了高效、...

    策略模式干掉Spring中大片的 if else.docx

    策略模式在 Java 中的应用 - 剔除 if-else 代码,提高代码可读性 在软件开发中,if-else 语句是非常常见的,但是大量的 if-else 语句会使代码变得难以阅读和维护。今天,我们将讨论如何使用策略模式来取代 if-else ...

    桶装矿泉水三菱程序+注解(FX1N-60MT).zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例

    桶装矿泉水三菱程序+注解(FX1N-60MT).zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例桶装矿泉水三菱程序+注解(FX1N-60MT).zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例桶装...

    注册表 +注解

    4156注册表+注解注册表+注解注册表+注解

    Spring + Xfire + 注解方式

    标题 "Spring + Xfire + 注解方式" 指向的是一个关于整合Spring框架与Xfire服务框架,并利用注解进行配置的教程。这个主题涵盖了Java企业级开发中的服务集成和简化配置两个重要方面。 首先,Spring是一个广泛使用的...

    Mybatis+注解轻松实现脱敏

    【Mybatis+注解轻松实现脱敏】是一个针对Java开发工程师的实用技术,旨在帮助他们在处理敏感数据时,如身份证号、手机号等信息,进行数据脱敏和加密。这一技术结合了MyBatis插件和注解的方式,使得数据脱敏过程变得...

    sping+hiberate+注解项目配置

    - `@GeneratedValue`:主键生成策略,可以设置为 AUTO、IDENTITY、SEQUENCE 等。 - `@Column`:定义列属性,包括长度、是否允许为空等。 - `@OneToMany`、`@ManyToOne`、`@OneToOne` 和 `@ManyToMany`:表示不同...

    运用lambda表达式+策略模式实现平台业务扩展

    将策略模式进行能力话,可作为jar包引入既可以使用...运用lambda表达式+策略模式+注解等知识点,提供给大家学习,也可将其优化并用于平台建设。对应博客:https://blog.csdn.net/lightj1996/article/details/103656673

    Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验.docx

    Spring Boot + Redis + 注解 + 拦截器来实现接口幂等性校验

    深入浅出Java注解(注解概述+注解的本质+反射注解信息+元注解+属性的数据类型及特别的属性:value和数组)

    "Java 注解详解" Java 注解是 Java 中最重要却最容易被人遗忘的知识点。很多人不明白它是怎么起作用的,甚至有人把它和注释混淆。实际上,Java 注解是 Java 中一种特殊的元数据,提供了关于程序元素的信息。 注解...

    基于注解策略模式的Java代码优化:干掉if-else与case-switch,实现优雅维护

    该项目采用注解策略模式重构Java代码,旨在消除if-else和case-switch结构,实现代码的优雅和易于维护。项目包含30个文件,其中包括15个Java源文件、7个XML文件、3个Markdown文件、2个Git忽略文件、1个Maven构建文件...

    SSM-xml+注解-员工信息管理+总结笔记+数据库文件.zip

    SSM-xml+注解-员工信息管理+总结笔记+数据库文件 主要利用xml配置问价+注解整合SSM框架,在此基础上实现一套crud。 前端没有使用模板,所以大道至简,主要是联系ssm框架的整合方法。 适用于正在学的java的朋友们借鉴...

    spring3.0 + ibatis+jquery+注解建立dao、service类

    标题 "spring3.0 + ibatis+jquery+注解建立dao、service类" 提供了我们讨论的核心技术栈,这是构建一个基于Java的Web应用程序的常见组合。Spring框架是核心,用于依赖注入(DI)和面向切面编程(AOP),iBatis则作为...

    使用策略模式改造if分支过多的方法

    策略模式允许我们将每一种策略(即每一种筛查模式)封装成一个独立的类,从而避免if-else结构的膨胀。 在给定的需求中,交易系统需要根据不同的筛查模式筛选商户,并对筛选后的商户进行处理。原始的实现方式是通过...

Global site tag (gtag.js) - Google Analytics