模板模式
模板模式属于行为模式.
简单理解,某一套程序的流程是不改变的,但是具体的内容是可以更改的。
例如公司的财务报表,需要进行申请,然后经理签字以后才可以审批下来。
流程:下属财务资金审核提交---->经理审核---->经理签字---->审批完成
内容:有2个人去申请资金,他们执行的流程是一样的,但是具体申请的资金以及经理审批后给予的资金是作为内容可以改变的。
使用场景
- 虚公用方法
- 通用流程抽象到父类,由子类完成具体实现内容
- 父类完成具体方法,子类hook完成具体细节
代码示例
(一)资金审核流程接口
public interface Step {
void stepOne();
void stepTwo();
void stepThree();
void stepFinish();
}
审核需要4次流程,在第一步的流程中需要传入准备审核的金额。
(二)具体的审核流程
public class FundRequest implements Step {
protected int auditAmount = 0;
protected int actualAmount = 0;
@Override
public void stepOne() {
System.out.print("\n" + "预备审核资金:" + String.valueOf(auditAmount));
}
@Override
public void stepTwo() {
System.out.print("\n" + "经理审核金额:" + String.valueOf(auditAmount));
}
@Override
public void stepThree() {
System.out.print("\n" + "经理审批金额:" + String.valueOf(actualAmount));
}
@Override
public void stepFinish() {
System.out.print("\n" + "审批允许的实际金额:" + String.valueOf(actualAmount));
}
//审核流程 不可更改
public final void review() {
if (auditAmount <= 0) {
System.out.print("\n" + "请先调用StepOne添加预备审核资金");
return;
}
System.out.println("\n" + "\n" + "------资金审核开始------");
stepTwo();
stepThree();
stepFinish();
System.out.println("\n" + "\n" + "------资金审核结束-------");
}
}
在审查过程中,将实际可以修改的金额内容放在外部,具体流程按照1--->2--->3--->4执行下去.
(三)下属的具体资金审核请求
public class StaffOneRequest extends FundRequest {
public StaffOneRequest(int auditAmount,int actualAmount) {
this.auditAmount = auditAmount;
this.actualAmount = actualAmount;
}
@Override
public void stepOne() {
super.stepOne();
}
@Override
public void stepTwo() {
super.stepTwo();
}
@Override
public void stepThree() {
super.stepThree();
}
@Override
public void stepFinish() {
super.stepFinish();
}
}
在构造参数中对具体的内容金额进行输入输出.
调用方式
//员工一号
StaffOneRequest staffOneRequest=new StaffOneRequest(20,10);//审核金额20,通过金额10
staffOneRequest.review();
//员工二号
StaffOneRequest staffOneRequest2=new StaffOneRequest(50,50);//审核金额50,通过金额50
staffOneRequest2.review();
分别两个员工请求,通过构造参数的修改传值,在不改变实际流程的情况下完成对内容的更改.(有需求的也可以扩展方法进行修改,这里不做演示)
显示结果
------资金审核开始------
经理审核金额:20
经理审批金额:10
审批允许的实际金额:10
------资金审核结束-------
------资金审核开始------
经理审核金额:50
经理审批金额:50
审批允许的实际金额:50
------资金审核结束-------
总结
优点
封装内容不会受到改变,提高代码的使用率,方便维护,仅仅对需要修改的具体内容做开放更改
缺点
个人觉得没有什么缺点,如果有的话也就是如果流程过于复杂的情况下,整体的流程需要到具体的流程控制的类去阅读,具体实现的子类无法看到具体流程的执行方式方法