Java描述設計模式(19):模板方法模式
本文原始碼: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
相關文章
- Java設計模式-模板方法模式Java設計模式
- Java設計模式之(十三)——模板方法模式Java設計模式
- JAVA設計模式之模板方法Java設計模式
- 設計模式-模板方法模式設計模式
- 折騰Java設計模式之模板方法模式Java設計模式
- Java設計模式——模板設計模式Java設計模式
- Java設計模式之模板方法模式和建造者模式Java設計模式
- python設計模式-模板方法模式Python設計模式
- js設計模式--模板方法模式JS設計模式
- 設計模式之模板方法模式設計模式
- 設計模式之【模板方法模式】設計模式
- 設計模式之----Java模板模式設計模式Java
- 模板方法設計模式設計模式
- java模板設計模式Java設計模式
- 《Head First 設計模式》:模板方法模式設計模式
- PHP設計模式之模板方法模式PHP設計模式
- 簡說設計模式——模板方法模式設計模式
- 極簡設計模式-模板方法模式設計模式
- 設計模式實戰-模板方法模式設計模式
- 23種設計模式(四)- 模板方法設計模式設計模式
- 設計模式之模板方法設計模式
- C#設計模式(14)——模板方法模式C#設計模式
- javascript設計模式 之 8 模板方法模式JavaScript設計模式
- 13.java設計模式之模板模式Java設計模式
- 設計模式-模板模式設計模式
- 設計模式——模板模式設計模式
- 設計模式之責任鏈模式——Java語言描述設計模式Java
- 設計模式 | 模板方法模式及典型應用設計模式
- C#設計模式-模板方法模式(Template Method)C#設計模式
- Rust語言之GoF設計模式: 模板方法模式RustGo設計模式
- 原始碼中的設計模式--模板方法模式原始碼設計模式
- 詳解模板方法設計模式設計模式
- Go 實現常用設計模式(七)模板方法模式Go設計模式
- 19.java設計模式之備忘錄模式Java設計模式
- java設計模式-工廠方法模式Java設計模式
- 原始碼中的設計模式--模板方法模式(鉤子方法)原始碼設計模式
- 23種設計模式之模板方法設計模式
- 設計模式漫談之模板方法設計模式