应用策略模式优化if_else

需求

目前在改造项目中的一个功能,简化一下业务逻辑 具体需求如下

现在是需要提供一个接口,接口会传入一个mark标识 以及一个url 需要根据不同的mark标识的策略 在url后面拼接一些不同的参数 再将url返回。

  • 常见的做法就是去使用 if/else 判断,看看url后面该拼什么参数 拼接后返回

  • 考虑到该接口后面可能需要适配更多的拼接策略 我使用策略模式对 if/else 进行了优化 具体代码如下

代码

首先定义处理url拼接的service 为了方便拓展 我们设计为一个接口,以及两个实现类,实现类分别代表了不同的拼接策略

如下 分为A、B两种策略,A策略是需要拼接userId这个参数 值为a,B策略是需要拼接uuid这个参数 值为b(这里只是为了演示)

java 复制代码
public interface LinkRedirectService {
    String getUrl(Map<String,String> map);
}

@Service("urlA")
public class UrlALinkRedirectServiceImpl implements LinkRedirectService {
    @Override
    public String getUrl(Map<String, String> map) {
        return map.get("url") + "?userId=a";
    }
}

@Service("urlB")
public class UrlBExamLinkRedirectServiceImpl implements LinkRedirectService {
    @Override
    public String getUrl(Map<String, String> map) {
        return map.get("url") + "?uuid=b";
    }
}

接下来 定义一个策略类 在初始化时 把上面的实现类都加载进内部的Map集合,bean名称为key、对象为value

java 复制代码
@Component
public class LinkRedirectServiceStrategy {

    @Autowired
    ApplicationContext applicationContext;

    private static Map<String, LinkRedirectService> map = new HashMap<>();

    //bean初始化时 获取到所有LinkRedirectService类型的bean 注入到map集合
    @PostConstruct
    public void init() {
        map = applicationContext.getBeansOfType(LinkRedirectService.class);
    }

    //提供getUrl方法 供Controller层调用 直接根据传入的mark 找到对应的实现类 去执行拼接逻辑 避免了if/else
    public String getUrl(Map<String, String> param) {
        String mark = param.get("mark");
        if (map.containsKey(mark)) {
            return map.get(mark).getUrl(param);
        }
        return param.get("url");
    }
}

控制器层 注入这个 LinkRedirectServiceStrategy 、调用getUrl传入参数即可

后续如果再需要添加新的策略,只需要为 LinkRedirectService 接口 增加新的实现类即可,同时还需要注意:实现类的bean名称需要和接口传入的mark保持一致。

相关推荐
考虑考虑2 分钟前
Springboot捕获feign抛出的异常
spring boot·后端·spring
洛神灬殇3 分钟前
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 时间事件处理部分)
redis·后端
DataFunTalk11 分钟前
Foundation Agent:深度赋能AI4DATA
前端·后端·算法
mokkaio13 分钟前
如何设计代码逻辑
架构
楽码14 分钟前
一文看懂隐藏功能!语言的逃逸分析
后端·go·编程语言
RunsenLIu23 分钟前
基于Django实现的图书分析大屏系统项目
后端·python·django
omnibots28 分钟前
ESP-ADF外设子系统深度解析:esp_peripherals组件架构与核心设计(输入类外设之触摸屏 Touch)
嵌入式硬件·架构·iot
Chandler2434 分钟前
Go:低级编程
开发语言·后端·golang
Asthenia041241 分钟前
ArrayList与CopyOnWriteArrayList源码深度解析及面试拷打
后端
Asthenia041241 分钟前
深入解析String、StringBuilder、StringBuffer与final修饰对象的问题
后端