Java描述設計模式(19):模板方法模式
- 2019 年 11 月 15 日
- 筆記
本文源碼:GitHub·點這裡 || GitEE·點這裡
一、生活場景
通常一款互聯網應用的開發流程如下:業務需求,規劃產品,程序開發,測試交付。現在基於模板方法模式進行該過程描述。
public class C01_InScene { public static void main(String[] args) { DevelopApp developApp = new DevelopApp() ; developApp.templateMethod() ; } } /** * 軟件開發抽象類 */ abstract class SoftDevelop { public void templateMethod(){ //調用基本方法 doBiz (); doProduct(); doDevelop(); doTest(); } public abstract void doBiz () ; public abstract void doProduct () ; public abstract void doDevelop () ; public abstract void doTest () ; } /** * APP開發具體類 */ class DevelopApp extends SoftDevelop { @Override public void doBiz() { System.out.println("整理App業務"); } @Override public void doProduct() { System.out.println("輸出App產品"); } @Override public void doDevelop() { System.out.println("進行App開發"); } @Override public void doTest() { System.out.println("進行App測試"); } }
二、模板方法模式
1、基礎概念
模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不同的子類可以用不同的方式實現這些抽象方法,從而對剩餘的邏輯有不同的實現。簡單說,模板方法模式定義流程中的核心的框架,而將實際的業務操作延遲到子類中,使得子類可以不改變流程的結構,但可以重定義業務程序。
2、模式圖解
3、核心角色
- 抽象模板角色
類中實現了模板方法(template),定義流程結構,具體業務需求子類需要去實現。
- 具體模板角色
實現父類所定義的一個或多個抽象方法,是整個流程的組成方法。抽象模板角色都可以有任意多個具體模板角色與之對應,具體模板角色都可以給出這些抽象方法的不同實現。
4、源碼實現
/** * 抽象模板角色 */ abstract class AbstractTemplate { /** * 模板方法 */ public void templateMethod(){ //調用基本方法 abstractMethod(); hookMethod(); concreteMethod(); } /** * 相關基本方法 */ protected abstract void abstractMethod(); protected void hookMethod(){} private final void concreteMethod(){} } /** * 具體模板角色 */ class ConcreteTemplate extends AbstractTemplate{ /** * 基本方法的實現 */ @Override public void abstractMethod() { } /** * 重寫父類的方法 */ @Override public void hookMethod(){ } }
5、不同方法描述
- 模板方法
定義在抽象類中的,把基本操作方法組合在一起形成一個總流程的方法,可以有任意多個模板方法。
- 基本方法
- 抽象方法:抽象方法由抽象類聲明,由具體子類實現。
- 具體方法:具體方法由抽象類聲明並實現,而子類並不實現。
- 鉤子方法:鉤子方法由抽象類聲明並實現,而子類可以加以擴展。
三、JavaEE應用
HttpServlet擔任抽象模板角色,模板方法:由service()方法擔任。基本方法:由doPost()、doGet()等方法擔任。service()方法流程,省略了部分判斷邏輯。該方法調用七個do方法中的一個或幾個,完成對客戶端請求的響應。這些do方法需要由HttpServlet的具體子類提供,在JavaEE中使用時,通常會自己實現相關方法。在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