模板模式
模板模式屬于行為模式.
簡單理解,某一套程序的流程是不改變的,但是具體的內容是可以更改的。
例如公司的財務報表,需要進行申請,然后經理簽字以后才可以審批下來。
流程:下屬財務資金審核提交---->經理審核---->經理簽字---->審批完成
內容:有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
------資金審核結束-------
總結
優點
封裝內容不會受到改變,提高代碼的使用率,方便維護,僅僅對需要修改的具體內容做開放更改
缺點
個人覺得沒有什么缺點,如果有的話也就是如果流程過于復雜的情況下,整體的流程需要到具體的流程控制的類去閱讀,具體實現的子類無法看到具體流程的執行方式方法