MST

星途 面试题库

面试题:Java模板方法模式与业务流程标准化中的可扩展性

在使用Java模板方法模式实现业务流程标准化时,如何确保系统具有良好的可扩展性?比如当业务流程新增步骤或者修改现有步骤逻辑时,怎样在最小化代码改动的情况下实现?请结合代码示例阐述。
37.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 模板方法模式简介
    • 模板方法模式定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现。使得子类可以在不改变算法结构的前提下重新定义该算法的某些特定步骤。
  2. 确保可扩展性的方法
    • 使用抽象方法和钩子方法
      • 抽象方法:对于业务流程中需要子类具体实现的步骤,定义为抽象方法。这样在新增步骤时,只需在子类中实现该抽象方法即可,对现有代码改动小。
      • 钩子方法:对于一些可选的步骤,可以定义为钩子方法(空方法或默认实现方法)。当需要修改现有步骤逻辑时,在子类中重写钩子方法,而不影响整体的算法骨架。
  3. 代码示例
// 抽象模板类
abstract class BusinessProcessTemplate {
    // 模板方法,定义业务流程
    public final void executeProcess() {
        step1();
        step2();
        if (isStep3Needed()) {
            step3();
        }
        step4();
    }

    // 具体步骤1,由子类实现
    protected abstract void step1();

    // 具体步骤2,由子类实现
    protected abstract void step2();

    // 钩子方法,判断是否需要执行步骤3
    protected boolean isStep3Needed() {
        return true;
    }

    // 具体步骤3,由子类实现
    protected abstract void step3();

    // 具体步骤4,由子类实现
    protected abstract void step4();
}

// 具体业务流程子类1
class ConcreteBusinessProcess1 extends BusinessProcessTemplate {
    @Override
    protected void step1() {
        System.out.println("ConcreteBusinessProcess1 Step1 implementation");
    }

    @Override
    protected void step2() {
        System.out.println("ConcreteBusinessProcess1 Step2 implementation");
    }

    @Override
    protected void step3() {
        System.out.println("ConcreteBusinessProcess1 Step3 implementation");
    }

    @Override
    protected void step4() {
        System.out.println("ConcreteBusinessProcess1 Step4 implementation");
    }
}

// 具体业务流程子类2
class ConcreteBusinessProcess2 extends BusinessProcessTemplate {
    @Override
    protected void step1() {
        System.out.println("ConcreteBusinessProcess2 Step1 implementation");
    }

    @Override
    protected void step2() {
        System.out.println("ConcreteBusinessProcess2 Step2 implementation");
    }

    @Override
    protected boolean isStep3Needed() {
        return false;
    }

    @Override
    protected void step4() {
        System.out.println("ConcreteBusinessProcess2 Step4 implementation");
    }

    // 因为isStep3Needed返回false,这里无需实现step3
}
  1. 新增步骤示例
    • 假设要在 executeProcess 方法中的 step2 之后新增一个步骤 step2_5
    • 首先在抽象类 BusinessProcessTemplate 中添加一个抽象方法 step2_5
abstract class BusinessProcessTemplate {
    public final void executeProcess() {
        step1();
        step2();
        step2_5();// 新增步骤
        if (isStep3Needed()) {
            step3();
        }
        step4();
    }

    protected abstract void step1();
    protected abstract void step2();
    protected boolean isStep3Needed() {
        return true;
    }
    protected abstract void step3();
    protected abstract void step4();
    // 新增抽象方法
    protected abstract void step2_5();
}
  • 然后在具体子类 ConcreteBusinessProcess1ConcreteBusinessProcess2 中实现 step2_5 方法:
class ConcreteBusinessProcess1 extends BusinessProcessTemplate {
    @Override
    protected void step1() {
        System.out.println("ConcreteBusinessProcess1 Step1 implementation");
    }

    @Override
    protected void step2() {
        System.out.println("ConcreteBusinessProcess1 Step2 implementation");
    }

    @Override
    protected void step3() {
        System.out.println("ConcreteBusinessProcess1 Step3 implementation");
    }

    @Override
    protected void step4() {
        System.out.println("ConcreteBusinessProcess1 Step4 implementation");
    }

    @Override
    protected void step2_5() {
        System.out.println("ConcreteBusinessProcess1 Step2_5 implementation");
    }
}

class ConcreteBusinessProcess2 extends BusinessProcessTemplate {
    @Override
    protected void step1() {
        System.out.println("ConcreteBusinessProcess2 Step1 implementation");
    }

    @Override
    protected void step2() {
        System.out.println("ConcreteBusinessProcess2 Step2 implementation");
    }

    @Override
    protected boolean isStep3Needed() {
        return false;
    }

    @Override
    protected void step4() {
        System.out.println("ConcreteBusinessProcess2 Step4 implementation");
    }

    @Override
    protected void step2_5() {
        System.out.println("ConcreteBusinessProcess2 Step2_5 implementation");
    }
}
  1. 修改现有步骤逻辑示例
    • 假设要修改 step2 的逻辑。
    • 只需在具体子类中重写 step2 方法即可。例如,在 ConcreteBusinessProcess1 中:
class ConcreteBusinessProcess1 extends BusinessProcessTemplate {
    @Override
    protected void step1() {
        System.out.println("ConcreteBusinessProcess1 Step1 implementation");
    }

    @Override
    protected void step2() {
        System.out.println("Modified ConcreteBusinessProcess1 Step2 implementation");// 修改后的逻辑
    }

    @Override
    protected void step3() {
        System.out.println("ConcreteBusinessProcess1 Step3 implementation");
    }

    @Override
    protected void step4() {
        System.out.println("ConcreteBusinessProcess1 Step4 implementation");
    }

    @Override
    protected void step2_5() {
        System.out.println("ConcreteBusinessProcess1 Step2_5 implementation");
    }
}
  • 这样,通过模板方法模式,利用抽象方法和钩子方法,在新增步骤或修改现有步骤逻辑时,能够最小化代码改动,确保系统具有良好的可扩展性。