定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。

    【角色】

    • 抽象模版(AbstractTemplate):定义一系列抽象方法,或者实现的方法,又或者是钩子方法。即:定义流程。
    • 具体模版(ConcreteTemplate):实现父类抽象方法,基于本身不同的模版业务逻辑,实现不同的业务逻辑代码。即:抽象方法实现相同,内部逻辑不同。

      1. /**
      2. * 请假流程抽象模块
      3. */
      4. public abstract class AbstractLeaveFlow {
      5. /**
      6. * 请假申请
      7. */
      8. public final void apply() {
      9. // 请假类型
      10. leaveType();
      11. // 领导审批
      12. leader();
      13. // 备注
      14. remark();
      15. // 完结
      16. finish();
      17. }
      18. /**
      19. * 请假类型(父类默认实现,子类可以选择重写)
      20. */
      21. protected void leaveType() {
      22. System.out.println("请假");
      23. }
      24. /**
      25. * 领导审批(抽象方法,子类必须实现)
      26. */
      27. protected abstract void leader();
      28. /**
      29. * 备注(钩子方法:它默认不做任何事,子类可以视情况要不要覆盖它)
      30. */
      31. protected void remark() {
      32. }
      33. /**
      34. * 完结
      35. */
      36. private void finish() {
      37. System.out.println("流程完结!!!");
      38. }
      39. }
      1. /**
      2. * 年假流程
      3. */
      4. public class AnnualLeaveFlow extends AbstractLeaveFlow {
      5. @Override
      6. public void leaveType() {
      7. System.out.println("申请年假");
      8. }
      9. @Override
      10. protected void leader() {
      11. System.out.println("部门经理审批");
      12. }
      13. }
      1. /**
      2. * 病假流程
      3. */
      4. public class SickLeaveFlow extends AbstractLeaveFlow {
      5. @Override
      6. public void leaveType() {
      7. System.out.println("申请病假");
      8. }
      9. @Override
      10. protected void leader() {
      11. System.out.println("组长审批");
      12. }
      13. @Override
      14. public void remark() {
      15. System.out.println("两天以上需要开具医院证明!");
      16. }
      17. }
      1. /**
      2. * 其他流程
      3. */
      4. public class OtherLeaveFlow extends AbstractLeaveFlow {
      5. @Override
      6. protected void leader() {
      7. System.out.println("领导审批");
      8. }
      9. }

      ```java public class TemplateTest { public static void main(String[] args) {

      1. // 年假流程
      2. AnnualLeaveFlow annualLeaveFlow = new AnnualLeaveFlow();
      3. annualLeaveFlow.apply();
      4. System.out.println();
      5. // 病假流程
      6. SickLeaveFlow sickLeaveFLow = new SickLeaveFlow();
      7. sickLeaveFLow.apply();
      8. System.out.println();
      9. // 其他流程
      10. OtherLeaveFlow otherLeaveFLow = new OtherLeaveFlow();
      11. otherLeaveFLow.apply();

      } } ——输出—— 申请年假 部门经理审批 流程完结!!!

    申请病假 组长审批 两天以上需要开具医院证明! 流程完结!!!

    请假 领导审批 流程完结!!! ```