# 怎么使用Java模板方法模式
## 一、什么是模板方法模式
模板方法模式(Template Method Pattern)是行為型設計模式的一種,它定義了一個操作中的算法骨架,而將某些步驟延遲到子類中實現。模板方法使得子類可以不改變算法結構的情況下,重新定義算法中的某些特定步驟。
### 核心思想
- **固定流程**:父類定義不可變的算法執行流程
- **靈活擴展**:子類實現可變的細節步驟
- **好萊塢原則**:"Don't call us, we'll call you" - 父類調用子類方法
## 二、模式結構
```java
public abstract class AbstractClass {
// 模板方法(final防止子類覆蓋)
public final void templateMethod() {
primitiveOperation1();
primitiveOperation2();
concreteOperation();
hook();
}
// 抽象方法(必須由子類實現)
protected abstract void primitiveOperation1();
protected abstract void primitiveOperation2();
// 具體方法(已有默認實現)
protected void concreteOperation() {
// 實現代碼
}
// 鉤子方法(可選實現)
protected void hook() {}
}
抽象類(AbstractClass):
具體類(ConcreteClass):
AbstractList
、HttpServlet
JdbcTemplate
// 抽象類
public abstract class BeverageTemplate {
public final void prepareBeverage() {
boilWater();
brew();
pourInCup();
if(customerWantsCondiments()) {
addCondiments();
}
}
protected abstract void brew();
protected abstract void addCondiments();
private void boilWater() {
System.out.println("煮沸水");
}
private void pourInCup() {
System.out.println("倒入杯中");
}
// 鉤子方法
protected boolean customerWantsCondiments() {
return true;
}
}
// 具體實現
public class Coffee extends BeverageTemplate {
@Override
protected void brew() {
System.out.println("沖泡咖啡粉");
}
@Override
protected void addCondiments() {
System.out.println("加糖和牛奶");
}
@Override
protected boolean customerWantsCondiments() {
return false; // 不要調料
}
}
public class Tea extends BeverageTemplate {
@Override
protected void brew() {
System.out.println("浸泡茶葉");
}
@Override
protected void addCondiments() {
System.out.println("加檸檬");
}
}
public abstract class JdbcTemplate {
public final Object execute(String sql) {
Connection conn = null;
Statement stmt = null;
try {
// 1.獲取連接
conn = getConnection();
// 2.創建語句
stmt = conn.createStatement();
// 3.執行查詢
ResultSet rs = stmt.executeQuery(sql);
// 4.處理結果(交給子類)
return handleResult(rs);
} catch (SQLException e) {
// ...異常處理
} finally {
// 5.釋放資源
closeResources(conn, stmt);
}
return null;
}
protected abstract Object handleResult(ResultSet rs) throws SQLException;
private Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/test");
}
private void closeResources(Connection conn, Statement stmt) {
// 關閉資源實現...
}
}
鉤子方法(Hook Method)是模板方法模式的擴展點,它: - 在抽象類中提供默認空實現 - 子類可選擇覆蓋或不覆蓋 - 用于控制模板方法中的可選流程
protected boolean shouldLog() {
return false; // 默認不記錄日志
}
當需要更靈活地替換算法時,可以結合策略模式:
public class Context {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void executeTemplate() {
step1();
strategy.execute();
step3();
}
}
在Java 8中可以使用Lambda表達式簡化實現:
public void process(Consumer<Data> handler) {
init();
handler.accept(data);
cleanup();
}
模板方法與策略模式的區別?
為什么模板方法要聲明為final?
何時使用鉤子方法?
模板方法模式通過將不變行為搬移到父類,去除子類中的重復代碼,是代碼復用的基本技術。它在框架設計中尤其重要,定義了框架的骨架,允許用戶自定義特定步驟的實現。
模板方法模式體現了”好萊塢原則”,是面向對象設計中控制反轉的典型實現,合理使用可以大大提高代碼的可維護性和擴展性。
本文共計約2400字,詳細介紹了Java模板方法模式的核心概念、實現方式、使用場景以及高級應用技巧。通過具體代碼示例和對比分析,幫助開發者深入理解并正確應用該設計模式。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。