策略模式改写if else 高级使用

基本思路:使用静态map存储对象的class,通过map获取class文件实现策略,通过spring特性获取bean实现委派处理(单层或者多层)

业务场景:使用if判断多个场景的情况,业务代码臃肿难以分离时

不足之处:需要对静态map维护,动态维护方法

高级处理方式:可以配置数据库中对应的类名,通过redis缓存获取K-V对应的类名,再通过spring获取实例对象处理(内存维护处理和可配置化处理考虑)

本案例仅列举了第一层,多层委派处理一样,实际业务中已处理多层

具体实现如下:

工程结构

 测试类见最下面

1.maven部分

依赖lombok,主要是类上的日志注解部分

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>

2.springboot工程部分请参考其他文章或者本人其他博客

3.具体代码

spring获取bean工具类

@Component
public class SpringBeanUtils implements ApplicationContextAware {
    private ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public <T> T getBean(Class<T> aclass) {
        return applicationContext.getBean(aclass);
    }
}

4.业务实现

4.1实体对象

@Data
public class OrderInfo {
    private String j_country;
    private String d_country;
    private String d_province;
    private String d_city;
    private String d_address;
    private String express_type;
    private String d_post_code;
    private String declared_value;

}

 接口

public interface ICheckCountryService {
    void checkCountry(OrderInfo orderInfo);
}

 核心代码

@Service
public class CountryService implements ICheckCountryService {
    /**
     * 实现思路,使用静态map结合spring的特性来实现,最终业务的委派处理,从而避免的if else过多的不利于代码维护的情况
     */


    private static final Map<String, Class<? extends ICheckCountryService> > map = new HashMap<>();

    static {
        map.put("FR", FRCountryService.class);
        map.put("CN", CNCountryService.class);
    }

    @Resource
    private SpringBeanUtils springBeanUtils;

    @Override
    public void checkCountry(OrderInfo orderInfo) {
        Class<? extends ICheckCountryService> aClass = map.get(orderInfo.getD_country());
        if (Objects.nonNull(aClass)) {
            ICheckCountryService bean = springBeanUtils.getBean(aClass);
            bean.checkCountry(orderInfo);
        }
    }
}

业务代码,可以依照CountryService 以及对详细参数委派

@Service
@Slf4j
public class CNCountryService implements ICheckCountryService{
    /**
     * 如果有其他校验,还可以按照CountryService 那样委派,到最终的类去处理
     */
    private static final Map<String, Class<? extends ICheckCountryService> > map = new HashMap<>();


    @Resource
    private SpringBeanUtils springBeanUtils;

    @Override
    public void checkCountry(OrderInfo orderInfo) {
        log.info("当前处理的国家:{}",orderInfo.getD_country());
    }


}

业务代码,可以依照CountryService 以及对详细参数委派

@Service
@Slf4j
public class FRCountryService implements ICheckCountryService{


    @Override
    public void checkCountry(OrderInfo orderInfo) {
      log.info("当前处理的国家:{}",orderInfo.getD_country());
    }
}

测试类

    @Autowired
    private CountryService countryService;
    /**
     * 校验数据,对比2
     * @return
     */
    @RequestMapping(value = "checkParam")
    public String checkParam(@RequestBody OrderInfo orderInfo){

        if(Country.CN.equals(orderInfo.getD_country())){
            //业务处理
            log.info("处理业务1");
        }else if (Country.FR.equals(orderInfo.getD_country())){
           //业务处理
            log.info("处理业务2");
        }

        return "OK";
    }

    @RequestMapping(value = "checkParam2")
    public String checkParam2(@RequestBody OrderInfo orderInfo){
       log.info("请求参数:{}",orderInfo);
        countryService.checkCountry(orderInfo);
        return "OK";
    }

报文参数

{

    "d_country":"FR"

}

效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值