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

相关推荐
程序员-Benothing17 分钟前
Java ForkJoinPool 详解:从分治思想到高性能并行计算
java·开发语言·后端·面试·职场和发展
2601_9625029024 分钟前
点胶点钻机运动控制与视觉定位系统解析:精度、算法与工程实现
大数据·架构
鬼鬼鬼40 分钟前
从 Prompt 到 Harness:企业级 Agent 工程的完整演进之路
设计模式·架构·ai编程
山水洛行1 小时前
都在聊Context Engineering图工程,可你说的图和他说的不是一个图
后端
Yao8062 小时前
MinIO自建对象存储,省OSS费用的完整方案
前端·后端
Ai拆代码的曹操2 小时前
深夜告警风暴:Dubbo 异步调用回调丢失 300 次——一个 tech lead 的自述
后端·dubbo
gyx_这个杀手不太冷静2 小时前
Agent开发进阶指南(第 2 章):Agent 运行全流程拆解、上下文窗口、流式输出、记忆系统与 Function Call 实战
前端·架构·agent
anyup2 小时前
像这种问题千万别自己动手,否则你可太看不起 AI 了
前端·架构·trae
Codelinghu3 小时前
LangSmith Evaluate实战评估Agent,不要在玩Demo了
后端