定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
【角色】
- 抽象模版(AbstractTemplate):定义一系列抽象方法,或者实现的方法,又或者是钩子方法。即:定义流程。
具体模版(ConcreteTemplate):实现父类抽象方法,基于本身不同的模版业务逻辑,实现不同的业务逻辑代码。即:抽象方法实现相同,内部逻辑不同。
/*** 请假流程抽象模块*/public abstract class AbstractLeaveFlow {/*** 请假申请*/public final void apply() {// 请假类型leaveType();// 领导审批leader();// 备注remark();// 完结finish();}/*** 请假类型(父类默认实现,子类可以选择重写)*/protected void leaveType() {System.out.println("请假");}/*** 领导审批(抽象方法,子类必须实现)*/protected abstract void leader();/*** 备注(钩子方法:它默认不做任何事,子类可以视情况要不要覆盖它)*/protected void remark() {}/*** 完结*/private void finish() {System.out.println("流程完结!!!");}}
/*** 年假流程*/public class AnnualLeaveFlow extends AbstractLeaveFlow {@Overridepublic void leaveType() {System.out.println("申请年假");}@Overrideprotected void leader() {System.out.println("部门经理审批");}}
/*** 病假流程*/public class SickLeaveFlow extends AbstractLeaveFlow {@Overridepublic void leaveType() {System.out.println("申请病假");}@Overrideprotected void leader() {System.out.println("组长审批");}@Overridepublic void remark() {System.out.println("两天以上需要开具医院证明!");}}
/*** 其他流程*/public class OtherLeaveFlow extends AbstractLeaveFlow {@Overrideprotected void leader() {System.out.println("领导审批");}}
```java public class TemplateTest { public static void main(String[] args) {
// 年假流程AnnualLeaveFlow annualLeaveFlow = new AnnualLeaveFlow();annualLeaveFlow.apply();System.out.println();// 病假流程SickLeaveFlow sickLeaveFLow = new SickLeaveFlow();sickLeaveFLow.apply();System.out.println();// 其他流程OtherLeaveFlow otherLeaveFLow = new OtherLeaveFlow();otherLeaveFLow.apply();
} } ——输出—— 申请年假 部门经理审批 流程完结!!!
申请病假 组长审批 两天以上需要开具医院证明! 流程完结!!!
请假 领导审批 流程完结!!! ```
