如何定义一次通用方法,通过重写仅替换特定处理器调用?
当然可行!这正是模板方法模式的用武之地
你遇到的这种“固定逻辑重复写,只有一小部分逻辑变化”的场景,刚好是面向对象里模板方法模式的典型应用场景,完全可以实现“固定逻辑只定义一次,变化部分按需重写/传入”的需求。下面给你两种具体的实现思路,看哪种更适配你的代码风格:
方法一:用抽象类+模板方法(传统面向对象方式)
先把所有固定的逻辑(日志初始化、日志记录、try-catch包裹)封装在一个抽象类的模板方法里,把需要变化的“特定处理器调用”定义成抽象方法,留给子类去实现:
public abstract class BaseEndpointProcessor { // 这就是通用的模板方法,固定逻辑全在这里 public SomeObject processRequest() { // Create instance of Debug Log class DebugLog debugLog = new DebugLog(); // Log first entry debugLog.log("Starting endpoint processing"); try { // 调用子类实现的特定处理器逻辑 return executeSpecificHandler(); } catch (Exception e) { // Other generic calls(比如统一异常日志、默认返回值) debugLog.error("Endpoint processing failed", e); return new SomeObject(); // 或者抛出封装后的异常 } } // 抽象方法:留给子类实现具体的处理器调用 protected abstract SomeObject executeSpecificHandler(); }
然后每个端点只需要继承这个抽象类,重写抽象方法即可,不用再复制整个模板:
public class ExampleEndpoint extends BaseEndpointProcessor { @Override protected SomeObject executeSpecificHandler() { // 这里只写当前端点对应的特定处理器调用 return ExampleSpecificHandler.handle(); } }
使用的时候直接实例化子类调用模板方法:
SomeObject result = new ExampleEndpoint().processRequest();
方法二:用函数式接口+工具类(Java 8+ 简化版)
如果不想写太多子类,Java 8及以上可以用函数式接口来简化,把变化的逻辑当成参数传入模板方法:
首先定义一个函数式接口,用来描述“处理器的行为”:
@FunctionalInterface public interface EndpointHandler { SomeObject handle() throws Exception; }
然后写一个工具类,把固定逻辑封装成静态方法,接收这个函数式接口作为参数:
public class EndpointTemplateUtil { public static SomeObject processWithTemplate(EndpointHandler handler) { // 固定的日志逻辑 DebugLog debugLog = new DebugLog(); debugLog.log("Starting endpoint processing"); try { // 执行传入的特定处理器逻辑 return handler.handle(); } catch (Exception e) { // 统一的异常处理逻辑 debugLog.error("Processing failed", e); return new SomeObject(); } } }
这样每个端点的实现就变得非常简洁,直接用Lambda表达式传入特定处理器:
// 示例端点1 public static SomeObject example1() { return EndpointTemplateUtil.processWithTemplate(() -> { return HandlerForExample1.process(); }); } // 示例端点2 public static SomeObject example2() { return EndpointTemplateUtil.processWithTemplate(() -> { return HandlerForExample2.process(); }); }
这两种方式都能帮你彻底摆脱复制粘贴模板代码的麻烦:以后要修改日志格式、异常处理逻辑,只需要改模板部分即可,所有端点都会自动生效,维护成本大大降低。
内容的提问来源于stack exchange,提问作者AshK
相关产品推荐
相关产品推荐

