如何在不修改类的前提下为方法传入自定义功能,实现可配置的对象字段处理
如何在不修改类的前提下为方法传入自定义功能,实现可配置的对象字段处理
这问题问到点子上了——你现在的写法确实把处理逻辑和核心的解析逻辑耦合死了,每次加新功能都要动原类,完全违背了开闭原则。我给你推荐一个非常适合的方案:策略模式+依赖注入,完美解决这个可配置的需求,而且完全不用修改原有的Helper类核心逻辑。
核心思路
我们把字符串的处理逻辑从Helper类里抽离出来,定义一个统一的处理接口,每一种处理逻辑都作为这个接口的实现类。然后让Helper类依赖这个接口的集合,在处理字符串字段时,自动应用所有注册好的处理逻辑。这样以后要加新功能,只需要新增一个接口实现类就行,完全不用碰Helper的代码。
具体实现步骤
1. 定义字符串处理接口
先创建一个通用的接口,所有字符串处理逻辑都要实现这个接口:
public interface StringProcessor { // 输入原始字符串,返回处理后的字符串 String process(String input); }
2. 把原有逻辑封装成接口实现类
把你原来的switchName逻辑做成第一个实现类,用Spring的@Component标记让它被自动扫描:
import org.springframework.stereotype.Component; @Component public class AppleToOrangeProcessor implements StringProcessor { @Override public String process(String input) { return input.replace("apple", "orange"); } }
3. 新增处理逻辑只需要加新的实现类
比如你想加“给字符串追加hello”的功能,直接新建一个实现类就行:
import org.springframework.stereotype.Component; @Component public class AddHelloProcessor implements StringProcessor { @Override public String process(String input) { return input + "hello"; } }
4. 修改Helper类,注入所有处理策略
把原来硬编码的处理逻辑替换成注入的StringProcessor集合,然后在处理字符串时依次应用所有策略:
import org.apache.commons.lang.reflect.FieldUtils; import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.util.List; @Component public class Helper { private final List<StringProcessor> stringProcessors; // 构造注入所有Spring容器中的StringProcessor实现类 public Helper(List<StringProcessor> stringProcessors) { this.stringProcessors = stringProcessors; } @SuppressWarnings("unchecked") public void parse(Object obj) throws IllegalAccessException { if (obj == null) { return; } for (Field field : obj.getClass().getDeclaredFields()) { field.setAccessible(true); Object fieldValue = FieldUtils.readField(obj, field.getName(), true); if (fieldValue instanceof String) { String processedValue = (String) fieldValue; // 依次执行所有注册的字符串处理逻辑 for (StringProcessor processor : stringProcessors) { processedValue = processor.process(processedValue); } field.set(obj, processedValue); } else { // 递归处理嵌套对象 parse(fieldValue); } } } }
额外优化点
- 如果需要控制处理逻辑的执行顺序,只需要给实现类加上
@Order注解,比如@Order(1)、@Order(2),数字越小优先级越高。 - 如果以后需要针对特定字段做处理(比如只处理名字叫
username的字段),可以给StringProcessor接口加一个matches(Field field)方法,判断当前字段是否需要应用该处理器,进一步提升灵活性。
这样改造之后,你的Helper类就彻底符合开闭原则了——对修改关闭,对扩展开放,想加多少新的处理逻辑都不用动原类,只需要新增实现类即可。
备注:内容来源于stack exchange,提问作者kar
相关产品推荐
相关产品推荐

