Java描述设计模式(19):模板方法模式
本文源碼:GitHub·點(diǎn)這里 || GitEE·點(diǎn)這里
一、生活場(chǎng)景
通常一款互聯(lián)網(wǎng)應(yīng)用的開發(fā)流程如下:業(yè)務(wù)需求,規(guī)劃產(chǎn)品,程序開發(fā),測(cè)試交付。現(xiàn)在基于模板方法模式進(jìn)行該過程描述。
public class C01_InScene {public static void main(String[] args) {DevelopApp developApp = new DevelopApp() ;developApp.templateMethod() ;} } /*** 軟件開發(fā)抽象類*/ abstract class SoftDevelop {public void templateMethod(){//調(diào)用基本方法doBiz ();doProduct();doDevelop();doTest();}public abstract void doBiz () ;public abstract void doProduct () ;public abstract void doDevelop () ;public abstract void doTest () ; } /*** APP開發(fā)具體類*/ class DevelopApp extends SoftDevelop {@Overridepublic void doBiz() {System.out.println("整理App業(yè)務(wù)");}@Overridepublic void doProduct() {System.out.println("輸出App產(chǎn)品");}@Overridepublic void doDevelop() {System.out.println("進(jìn)行App開發(fā)");}@Overridepublic void doTest() {System.out.println("進(jìn)行App測(cè)試");} }二、模板方法模式
1、基礎(chǔ)概念
模板方法模式是類的行為模式。準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后聲明一些抽象方法來迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類可以用不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn)。簡(jiǎn)單說,模板方法模式定義流程中的核心的框架,而將實(shí)際的業(yè)務(wù)操作延遲到子類中,使得子類可以不改變流程的結(jié)構(gòu),但可以重定義業(yè)務(wù)程序。
2、模式圖解
3、核心角色
- 抽象模板角色
類中實(shí)現(xiàn)了模板方法(template),定義流程結(jié)構(gòu),具體業(yè)務(wù)需求子類需要去實(shí)現(xiàn)。
- 具體模板角色
實(shí)現(xiàn)父類所定義的一個(gè)或多個(gè)抽象方法,是整個(gè)流程的組成方法。抽象模板角色都可以有任意多個(gè)具體模板角色與之對(duì)應(yīng),具體模板角色都可以給出這些抽象方法的不同實(shí)現(xiàn)。
4、源碼實(shí)現(xiàn)
/*** 抽象模板角色*/ abstract class AbstractTemplate {/*** 模板方法*/public void templateMethod(){//調(diào)用基本方法abstractMethod();hookMethod();concreteMethod();}/*** 相關(guān)基本方法*/protected abstract void abstractMethod();protected void hookMethod(){}private final void concreteMethod(){} } /*** 具體模板角色*/ class ConcreteTemplate extends AbstractTemplate{/*** 基本方法的實(shí)現(xiàn)*/@Overridepublic void abstractMethod() {}/*** 重寫父類的方法*/@Overridepublic void hookMethod(){} }5、不同方法描述
- 模板方法
定義在抽象類中的,把基本操作方法組合在一起形成一個(gè)總流程的方法,可以有任意多個(gè)模板方法。
- 基本方法
三、JavaEE應(yīng)用
HttpServlet擔(dān)任抽象模板角色,模板方法:由service()方法擔(dān)任。基本方法:由doPost()、doGet()等方法擔(dān)任。service()方法流程,省略了部分判斷邏輯。該方法調(diào)用七個(gè)do方法中的一個(gè)或幾個(gè),完成對(duì)客戶端請(qǐng)求的響應(yīng)。這些do方法需要由HttpServlet的具體子類提供,在JavaEE中使用時(shí),通常會(huì)自己實(shí)現(xiàn)相關(guān)方法。在API的封裝是典型的模板方法模式。
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {if (method.equals("GET")) {this.doGet(req, resp);} else if (method.equals("HEAD")) {this.doHead(req, resp);} else if (method.equals("POST")) {this.doPost(req, resp);} else if (method.equals("PUT")) {this.doPut(req, resp);} else if (method.equals("DELETE")) {this.doDelete(req, resp);} else if (method.equals("OPTIONS")) {this.doOptions(req, resp);} else if (method.equals("TRACE")) {this.doTrace(req, resp);} else {String errMsg = lStrings.getString("http.method_not_implemented");Object[] errArgs = new Object[]{method};errMsg = MessageFormat.format(errMsg, errArgs);resp.sendError(501, errMsg);} }四、源代碼地址
GitHub·地址 https://github.com/cicadasmile/model-arithmetic-parent GitEE·地址 https://gitee.com/cicadasmile/model-arithmetic-parent總結(jié)
以上是生活随笔為你收集整理的Java描述设计模式(19):模板方法模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Metaphors for a rich
- 下一篇: JavaEE基础(05):过滤器、监听器