溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java描述設(shè)計模式(19):模板方法模式

發(fā)布時間:2020-06-26 03:34:26 來源:網(wǎng)絡(luò) 閱讀:162 作者:知了一笑 欄目:編程語言

本文源碼:GitHub·點這里 || GitEE·點這里

一、生活場景

通常一款互聯(lián)網(wǎng)應(yīng)用的開發(fā)流程如下:業(yè)務(wù)需求,規(guī)劃產(chǎn)品,程序開發(fā),測試交付。現(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 {
    @Override
    public void doBiz() {
        System.out.println("整理App業(yè)務(wù)");
    }
    @Override
    public void doProduct() {
        System.out.println("輸出App產(chǎn)品");
    }
    @Override
    public void doDevelop() {
        System.out.println("進(jìn)行App開發(fā)");
    }
    @Override
    public void doTest() {
        System.out.println("進(jìn)行App測試");
    }
}

二、模板方法模式

1、基礎(chǔ)概念

模板方法模式是類的行為模式。準(zhǔn)備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實現(xiàn),然后聲明一些抽象方法來迫使子類實現(xiàn)剩余的邏輯。不同的子類可以用不同的方式實現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實現(xiàn)。簡單說,模板方法模式定義流程中的核心的框架,而將實際的業(yè)務(wù)操作延遲到子類中,使得子類可以不改變流程的結(jié)構(gòu),但可以重定義業(yè)務(wù)程序。

2、模式圖解

Java描述設(shè)計模式(19):模板方法模式

3、核心角色

  • 抽象模板角色

類中實現(xiàn)了模板方法(template),定義流程結(jié)構(gòu),具體業(yè)務(wù)需求子類需要去實現(xiàn)。

  • 具體模板角色

實現(xiàn)父類所定義的一個或多個抽象方法,是整個流程的組成方法。抽象模板角色都可以有任意多個具體模板角色與之對應(yīng),具體模板角色都可以給出這些抽象方法的不同實現(xiàn)。

4、源碼實現(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{
    /**
     * 基本方法的實現(xiàn)
     */
    @Override
    public void abstractMethod() {
    }
    /**
     * 重寫父類的方法
     */
    @Override
    public void hookMethod(){
    }
}

5、不同方法描述

  • 模板方法

定義在抽象類中的,把基本操作方法組合在一起形成一個總流程的方法,可以有任意多個模板方法。

  • 基本方法
  1. 抽象方法:抽象方法由抽象類聲明,由具體子類實現(xiàn)。
  2. 具體方法:具體方法由抽象類聲明并實現(xiàn),而子類并不實現(xiàn)。
  3. 鉤子方法:鉤子方法由抽象類聲明并實現(xiàn),而子類可以加以擴(kuò)展。

三、JavaEE應(yīng)用

Java描述設(shè)計模式(19):模板方法模式

HttpServlet擔(dān)任抽象模板角色,模板方法:由service()方法擔(dān)任?;痉椒ǎ河蒬oPost()、doGet()等方法擔(dān)任。service()方法流程,省略了部分判斷邏輯。該方法調(diào)用七個do方法中的一個或幾個,完成對客戶端請求的響應(yīng)。這些do方法需要由HttpServlet的具體子類提供,在JavaEE中使用時,通常會自己實現(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

Java描述設(shè)計模式(19):模板方法模式

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI