策略模式加上InitializingBean的编程实现

本文介绍如何利用Spring框架的InitializingBean接口和策略模式重构接口代码,减少大量条件判断,提高代码可维护性。

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

场景:最近在写一些接口,发现堆了太多的if…eles,所以通过实现Spring框架的InitializingBean接口,加上策略模式,避免代码里堆了太多if…else

实现思路:

  • 实现 ApplicationContextAware 接口,通过该接口获取 Spring 容器
  • 实现 InitializingBean 接口,接口中定义的 afterPropertiesSet(),Spring框架进行属性填充之后,将策略类加载到一个list列表里
  • 通过对应的标识flag获取对应的策略类,通过策略类调用具体方法

大量的if…else堆积:

if (condition1 || condition2) {
	// 具体实现业务
} else if ( condition3 || condition4) {
	// 具体业务
} else if (condition5 || condition6) {
	// ...
} 
... 

策略类接口

public interface InfoStrategy {
    List<InfoModel> obtainInfo(InfoQeury qeury);
    String getType();
}

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumMap;
import java.util.List;


@Service
@Slf4j
public class InfoServiceImpl implements InfoService, ApplicationContextAware, InitializingBean {

    private List<LInfoStrategy> queryStrategys = new ArrayList<>();
    private ApplicationContext applicationContext;

    @Override
    public List<InfoModel> listInfo(InfoQeury query) {
        String type = query.getType();
        log.info("传参 Type : {} , Code : {}" , type , code);
        return getStrategy(type).obtainInfo(query);
    }

    @Component
    class Strategy1 implements InfoStrategy {
        @Override
        public List<InfoModel> obtainInfo(InfoQeury qeury) {
            // ...
            return infos;
        }
        @Override
        public String getType() {
            return FlagType.1_FLAG.getCode();
        }
    }

    @Component
    class Strategy2 implements InfoStrategy {
        @Override
        public List<InfoModel> obtainInfo(InfoQeury qeury) {
            // ...
            return infos;
        }
        @Override
        public String getType() {
            return FlagType.2_FLAG.getCode();
        }
    }

    @Component
    class Strategy3 implements InfoStrategy {
        @Override
        public List<InfoModel> obtainInfo(InfoQeury qeury) {
            // ...
            return infos;
        }
        @Override
        public String getType() {
            return FlagType.3_FLAG.getCode();
        }
    }


    private InfoStrategy getStrategy(String strategyName) {
        for (InfoStrategy strategy : queryStrategys) {
            if (strategy.getType().equals(strategyName)) {
                return strategy;
            }
        }
        return null;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        Collection<InfoStrategy> strategys =
                applicationContext.getBeansOfType(InfoStrategy.class).values();
        queryStrategys.addAll(strategys);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nicky.Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值