FDA GMP

核心内容摘要

Qwen3-VL-8B-Instruct-GGUF与YOLOv8结合的工业质检实战案例
通义千问3-Reranker实测:如何提升文档推荐准确率?

突破AMD Ryzen电源调试困境:SMUDebugTool实现精细化核心电压控制

前言只有体验过几百行 if else 折磨的人才会对本篇产生共鸣1业务场景近日在公司领到一个小需求需要对之前已有的试用用户申请规则进行拓展。

我们的场景大概如下所示:if (是否海外用户) { return false; } if (刷单用户) { return false; } if (未付费用户 不再服务时段) { return false } if (转介绍用户 || 付费用户 || 内推用户) { return true; }按照上述的条件我们可以得出的结论是咱们的的主要流程主要是基于 and 或者 or 的关系。

如果有一个不匹配的话其实咱们后续的流程是不用执行的就是需要具备一个短路的功能。

对于目前的现状来说我如果在原有的基础上来改只要稍微注意一下解决需求不是很大的问题但是说后面可维护性非常差。

后面进过权衡过后我还是决定将这个部分进行重构一下。

2规则执行器针对这个需求我首先梳理了一下咱们规则执行器大概的设计 然后我设计了一个 V1 版本和大家一起分享一下如果大家也有这样的 case 可以给我分享留言下面部分主要是设计和实现的流程和 code.规则执行器的设计对于规则的抽象并实现规则// 业务数据 Data public class RuleDto { private String address; private int age; } // 规则抽象 public interface BaseRule { boolean execute(RuleDto dto); } // 规则模板 public abstract class AbstractRule implements BaseRule { protected T T convert(RuleDto dto) { return (T) dto; } Override public boolean execute(RuleDto dto) { return executeRule(convert(dto)); } protected T boolean executeRule(T t) { return true; } } // 具体规则- 例子1 public class AddressRule extends AbstractRule { Override public boolean execute(RuleDto dto) { System.out.println(AddressRule invoke!); if (dto.getAddress().startsWith(MATCH_ADDRESS_START)) { return true; } return false; } } // 具体规则- 例子2 public class NationalityRule extends AbstractRule { Override protected T T convert(RuleDto dto) { NationalityRuleDto nationalityRuleDto new NationalityRuleDto(); if (dto.getAddress().startsWith(MATCH_ADDRESS_START)) { nationalityRuleDto.setNationality(MATCH_NATIONALITY_START); } return (T) nationalityRuleDto; } Override protected T boolean executeRule(T t) { System.out.println(NationalityRule invoke!); NationalityRuleDto nationalityRuleDto (NationalityRuleDto) t; if (nationalityRuleDto.getNationality().startsWith(MATCH_NATIONALITY_START)) { return true; } return false; } } // 常量定义 public class RuleConstant { public static final String MATCH_ADDRESS_START 北京; public static final String MATCH_NATIONALITY_START 中国; }执行器构建public class RuleService { private MapInteger, ListBaseRule hashMap new HashMap(); private static final int AND 1; private static final int OR 0; public static RuleService create() { return new RuleService(); } public RuleService and(ListBaseRule ruleList) { hashMap.put(AND, ruleList); return this; } public RuleService or(ListBaseRule ruleList) { hashMap.put(OR, ruleList); return this; } public boolean execute(RuleDto dto) { for (Map.EntryInteger, ListBaseRule item : hashMap.entrySet()) { ListBaseRule ruleList item.getValue(); switch (item.getKey()) { case AND: // 如果是 and 关系同步执行 System.out.println(execute key

; if (!and(dto, ruleList)) { return false; } break; case OR: // 如果是 or 关系并行执行 System.out.println(execute key

; if (!or(dto, ruleList)) { return false; } break; default: break; } } return true; } private boolean and(RuleDto dto, ListBaseRule ruleList) { for (BaseRule rule : ruleList) { boolean execute rule.execute(dto); if (!execute) { // and 关系匹配失败一次返回 false return false; } } // and 关系全部匹配成功返回 true return true; } private boolean or(RuleDto dto, ListBaseRule ruleList) { for (BaseRule rule : ruleList) { boolean execute rule.execute(dto); if (execute) { // or 关系匹配到一个就返回 true return true; } } // or 关系一个都匹配不到就返回 false return false; } }执行器的调用public class RuleServiceTest { org.junit.Test public void execute() { //规则执行器 //优点比较简单每个规则可以独立将规则数据执行器拆分出来调用方比较规整 //缺点数据依赖公共传输对象 dto //

定义规则 init rule AgeRule ageRule new AgeRule(); NameRule nameRule new NameRule(); NationalityRule nationalityRule new NationalityRule(); AddressRule addressRule new AddressRule(); SubjectRule subjectRule new SubjectRule(); //

构造需要的数据 create dto RuleDto dto new RuleDto(); dto.setAge(

; dto.setName(张

; dto.setAddress(北京); dto.setSubject(数学);; //

通过以链式调用构建和执行 rule execute boolean ruleResult RuleService .create() .and(Arrays.asList(nationalityRule, nameRule, addressRule)) .or(Arrays.asList(ageRule, subjectRule)) .execute(dto); System.out.println(this student rule execute result : ruleResult); } }3

总结规则执行器的优点和缺点优点比较简单每个规则可以独立将规则数据执行器拆分出来调用方比较规整我在 Rule 模板类中定义 convert 方法做参数的转换这样可以能够为特定 rule 需要的场景数据提供拓展。

缺点上下 rule 有数据依赖性如果直接修改公共传输对象 dto 这样设计不是很合理建议提前构建数据。

菲姬APP直播-菲姬APP直播应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123