1. 程式人生 > >java設計模式之模板模式

java設計模式之模板模式

tty 理解 sta star 測試類 strong 實現 開閉原則 sep

  近日在項目開發中看到一段代碼不理解,在方法中居然調用抽象方法。後來在網上查說是模板模式

public abstract class JWBaseProcess implements JWProcess {
protected JWBaseProcess() {
try{
workitemManager = WAPIFactory.getWorkItemManager(JWConstants.FLOW_TASK);
} catch (BPMException e){
e.printStackTrace();
}
}
protected abstract void prefetchData

(HttpServletRequest request, PrdOnlineProcessForm popForm,UserInfo user) throws Exception;
public void prefetchWorkItemData(HttpServletRequest request, PrdOnlineProcessForm popForm,UserInfo user) throws Exception {
//為頁面顯示準備數據
prefetchData(request, popForm, user);
}
protected abstract void beforeFinishProcess(HttpServletRequest request, PrdOnlineProcessForm popForm,UserInfo user) throws Exception;
public void beforeFinishWorkItem(HttpServletRequest request, PrdOnlineProcessForm popForm,UserInfo user) throws Exception {
//保存下節點執行人
beforeFinishProcess(request, popForm,user);
}
protected abstract void afterFinishProcessForward(HttpServletRequest request, PrdOnlineProcessForm popForm,UserInfo user) throws Exception;
public void afterFinishProcessBack(HttpServletRequest request, PrdOnlineProcessForm popForm,UserInfo user) throws Exception{
}
public void afterFinishWorkItem(HttpServletRequest request, PrdOnlineProcessForm popForm,UserInfo user) throws Exception {
//保存批註
if(jiVo.getLinkId()!=null&&jiVo.getLinkId().startsWith(PrdOnlineConstants.PRDONLINE_LINKID_BACK_PRE)){
afterFinishProcessBack(request, popForm,user);
}else{
afterFinishProcessForward(request, popForm,user);
}
}
protected abstract void saveFinishProcess(PrdOnlineProcessForm popForm,UserInfo user) throws Exception;
public void saveFinishWorkItem( PrdOnlineProcessForm popForm,UserInfo user) throws Exception{
saveFinishProcess(popForm,user);
}

public String checkProcessData(PrdOnlineProcessForm popForm,UserInfo user) throws Exception{
return PrdOnlineConstants.PRDONLINE_CHECKDATA_RETURN_VALUE_SUCCESS;
}

protected void getPrdOnlinePrdInfo(PrdOnlinePrdInfoVo piVo, PrdOnlineAcceptProcessVo acceVo, PrdOnlineAccountProcessVo accoVo, PrdOnlineNoticeProcessVo notiVo, PrdOnlineParameterProcessVo paraVo,PrdOnlineBillProcessVo billVo, String code){
//獲取各個流程信息
}
}

設計模式之模板模式

模板方法模式:模板方法模式準備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。先制定一個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。開閉原則是指一個軟件實體應該對擴展開放,對修改關閉也就是說軟件實體必須是在不被修改的情況下被擴展。模板方法模式意圖是由抽象父類控制頂級邏輯,並把基本操作的實現推遲到子類去實現,這是通過繼承的手段來達到對象的復用,同時也遵守了開閉原則

我們結合上面的定義解釋一下該圖。
- AbstractClass便相當於上述作為抽象類的父類,ConcreteClass便是具體的實現子類。具體的應用中,可能存在一到多個實現子類。
- AbstractClass定義了一個publictemplateMethod()模板方法以及作為步驟的method1()method2()方法。
- AbstractClass#templateMethod()方法體調用method1()method2()方法
public void templateMethod() {
...
this.method()1;
...
this.method()2;
...
}
- method1()
method2()方法為受保護的抽象方法protected abstract)。實現子類ConcreteClass需要重載該方法。

Template Method模式的應用場景:

Template Method模式一般應用在具有以下條件的應用中:
- 具有統一的操作步驟或操作過程
- 具有不同的操作細節
- 存在多個具有同樣操作步驟的應用場景,但某些具體的操作細節卻各不相同

我們應該能夠找到實現一件事情的相同的部分和不相同的部分各是什麽:

舉個簡單的例子吧:比如說生產手機:生產的流程是相同的但是具體的細節可能有所不同(比如手機的顏色,手機的類別,手機的大小等等);

我們就用代碼來實現這個小小的例子:

首先要創建一個抽象的模板類:

package TemplateDemo;

/**

* 這是一個抽象的模板類

* */

abstract class AbstractClass {

//定義一個模板方法來控制生產手機的流程

public void makeMobile(){//TemplateMethod

//首先生產手機體(模板方法自己完成)

System.out.println("生產了一個手機body");

this.makeDifferentFunction();

this.makeDifferentColor();

this.makeDifferentType();

System.out.println("一部手機制作完成");

//以上模板已經規定好了

}

//定義抽象的方法來完成不同的生產細節(不同功能的手機)

protected abstract void makeDifferentFunction();

//定義抽象的方法來完成不同的生產細節(不同顏色的手機)

protected abstract void makeDifferentColor();

//定義抽象的方法來完成不同的生產細節(不同類型的手機)

protected abstract void makeDifferentType();

}

/**

* 創建真是的實現類來實現具體的生產細節

* */

class ConcreteClass extends AbstractClass{

//實現父類中的抽象的方法

protected void makeDifferentColor() {

System.out.println("給該手機的顏色塗成藍色");

}

protected void makeDifferentFunction() {

System.out.println("給該手機實現看MP4的功能");

}

protected void makeDifferentType() {

System.out.println("給該手機制作成翻蓋的");

}

}

//寫測試類

public class TestTemplate{

public static void main(String args[]){

AbstractClass ac = new ConcreteClass();//子類的對象付給父類

ac.makeMobile();//制作手機

//制作不同的手機只是修改子類就可以了

}

}

想要完成不同的實現細節的話就只是再寫不同的子類就是了,模板已經規定好了實現的流程

這樣一個簡單的模板方法模式的實例就完成了!

java設計模式之模板模式