Spring项目中干掉if-elese,写出优雅代码

项目中常因不同条件执行不同方法,类型多时代码维护痛苦,有大量if - else判断,不利于需求迭代和代码接手。文中先给出反面教材,后介绍优雅写法,包括策略枚举、抽象接口定义与实现及具体业务使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.背景:

在项目经常会遇到因为不同的条件执行不同的方法,当类型比较多的情况下,代码维护起来比较痛苦,并且会有大量的if-else判断。这样不管是后期的需求迭代还是别人接手代码,那都是相当的自闭。。。

2.反面教材:

首先我们先看下面一段代码,这边采用大量的状态if else 判定

 if ("AType".equals(tier)) {
	Map<String, Object> mapPar = new HashMap<String, Object>();
	mapPar.put("tier", tier);
	mapPar.put("tierStr", "");
	mapPar.put("tierStrOther", "");
	ApiResponse<List<Govdep>> govdepListApi = accountClient.getGovdepList(mapPar);
	if (govdepListApi.getStatus() == 200) {
		govdepList = govdepListApi.getBody();
	}
	return govdepList;
} else if ("AType".equals(tier)) {
	Map<String, Object> mapPar = new HashMap<String, Object>();
	mapPar.put("tier", "");
	mapPar.put("tierStr", tier);
	mapPar.put("tierStrOther", "");
	ApiResponse<List<Govdep>> govdepListApi = accountClient.getGovdepList(mapPar);
	if (govdepListApi.getStatus() == 200) {
		govdepList = govdepListApi.getBody();
	}
	return govdepList;
} else {
	Map<String, Object> mapPar = new HashMap<String, Object>();
	mapPar.put("tier", "");
	mapPar.put("tierStr", "");
	mapPar.put("tierStrOther", tier);
	ApiResponse<List<Govdep>> govdepListApi = accountClient.getGovdepList(mapPar);
	if (govdepListApi.getStatus() == 200) {
		govdepList = govdepListApi.getBody();
	}
	return govdepList;
}

3.优雅写法

  • 策略枚举
    public enum TypeEnum {
        A {
            @Override
            public Class acquireStrategy() {
                return ATypeStrategy.class;
            }
        },
        B {
            @Override
            public Class acquireStrategy() {
                return BTypeStrategy.class;
            }
        };
    
        public abstract Class<TypeStrategy> acquireStrategy();
    }
    
  • 抽象接口定义
    /**
     * 抽象接口
     */
    public interface TypeStrategy {
    
        void execute(String requestParam);
    
    }
    
  • 抽象接口实现
    @Component
    public class ATypeStrategy implements TypeStrategy {
    
        @Override
        public void execute(String requestParam) {
            System.out.println("执行A策略的业务代码");
        }
    }
    
    
    @Component
    public class BTypeStrategy implements TypeStrategy {
    
        @Override
        public void execute(String requestParam) {
            System.out.println("执行B的业务代码");
        }
    }
    
  • 具体业务使用
    /**
     * @title: BusinissessService
     * @description: 执行业务代码
     * @date 2020/12/27 7:24 下午
     */
    @Service
    public class BusinessService implements ApplicationContextAware {
    
        private ApplicationContext applicationContext;
    
        public void business(String requestParam, String type) {
            // 策略选取执行
            TypeStrategy typeStrategy = applicationContext.getBean(TypeEnum.valueOf(type).acquireStrategy());
            // 执策略方法
            typeStrategy.execute(requestParam);
        }
    	//此处利用了Spring声明周期中的特性, Spring 自动注入 ApplicationContext
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            this.applicationContext = applicationContext;
        }
    }
    
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值