Java/Kotlin类中调用共享子方法的多方法实现及设计模式咨询
Java/Kotlin中多方法调用子方法的顺序/数量差异化实现及设计模式选型
在同一个类中需要实现大量对外方法,这些方法都会调用同一批子方法,但要么调用顺序不同,要么调用的子方法数量有多有少。直接硬编码每个方法的调用逻辑会导致代码冗余、维护成本飙升——比如修改某个子方法的签名或逻辑时,要逐个更新所有依赖它的对外方法。
适用设计模式:命令模式(序列封装)
最适合的方案是用命令模式,把每个子方法封装成独立的命令单元,对外方法只需定义命令的执行序列,执行时按顺序调用即可。这种方式彻底消除了代码重复,流程变更也更灵活。
Java 实现示例
- 用函数式接口定义命令类型:
@FunctionalInterface private interface SubCommand { void execute(); }
- 将子方法封装为命令实例:
private final SubCommand sub1 = this::subMethod1; private final SubCommand sub2 = this::subMethod2; // 更多子方法的命令实例...
- 对外方法通过执行命令序列完成逻辑:
public void methodA() { executeCommands(sub1, sub2); } public void methodB() { executeCommands(sub2, sub1); } public void methodC() { executeCommands(sub1); } // 通用执行逻辑,统一处理命令序列 private void executeCommands(SubCommand... commands) { for (SubCommand cmd : commands) { cmd.execute(); } } // 原始子方法实现 private void subMethod1() { // 具体业务逻辑 } private void subMethod2() { // 具体业务逻辑 }
Kotlin 实现示例
Kotlin支持直接使用函数类型,无需额外定义接口,代码更简洁:
class MyClass { // 子方法实现 private fun subMethod1() { // 具体业务逻辑 } private fun subMethod2() { // 具体业务逻辑 } // 通用执行方法,遍历执行传入的函数序列 private fun executeCommands(vararg commands: () -> Unit) { commands.forEach { it() } } // 对外方法,直接指定子方法的执行顺序/数量 fun methodA() = executeCommands(::subMethod1, ::subMethod2) fun methodB() = executeCommands(::subMethod2, ::subMethod1) fun methodC() = executeCommands(::subMethod1) }
进阶优化
如果后续需要更复杂的流程(比如子方法间的条件分支、循环调用),可以扩展命令的定义:比如给命令增加参数、返回值,或者用组合模式把多个命令封装成复合命令,进一步提升流程的灵活性和可维护性。
内容的提问来源于stack exchange,提问作者abdel
相关产品推荐
相关产品推荐

