应用策略模式优化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保持一致。

相关推荐
IT_陈寒2 小时前
React状态管理终极对决:Redux vs Context API谁更胜一筹?
前端·人工智能·后端
晨星shine3 小时前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#
蝎子莱莱爱打怪3 小时前
OpenClaw 从零配置指南:接入飞书 + 常用命令 + 原理图解
java·后端·ai编程
天蓝色的鱼鱼3 小时前
模块化与组件化:90%的前端开发者都没搞懂的本质区别
前端·架构·代码规范
倚栏听风雨4 小时前
【ES避坑指南】明明存的是 "CodingAddress",为什么 term 查询死活查不到?彻底搞懂 text 和 keyword
后端
程序员爱钓鱼4 小时前
Go 操作 Windows COM 自动化实战:深入解析 go-ole
后端·go·排序算法
回家路上绕了弯4 小时前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
子玖4 小时前
实现微信扫码注册登录-基于参数二维码
后端·微信·go
IT_陈寒4 小时前
JavaScript代码效率提升50%?这5个优化技巧你必须知道!
前端·人工智能·后端
IT_陈寒4 小时前
Java开发必知的5个性能优化黑科技,提升50%效率不是梦!
前端·人工智能·后端