介紹:定義一個操作中的演算法骨架,將一些步驟延遲到子類中。準備一個抽模板,實現部分邏輯,再聲明一些對於子類需要不同實現的公用抽象方法。
情境:對於多個業務,它們的業務中有很多功能是相似的,有部分功能需要獨自實現。這樣我們就可以使用模板方法模式,將功能打散,抽取出更小的功能塊,減小重複代碼。 一、角色和作用
| 角色 |
作用 |
| 抽象模板 |
定義子類需要實現的不同功能塊,以及子類共用的功能塊 |
| 具體模板 |
實現各自不同的功能塊 |
二、沖泡熱飲
在泡咖啡和泡檸檬綠茶的時候,它們有部分功能是相同的-燒水,倒入杯子。而加的主料和調料是不同的。
熱飲
有一個子類無法覆蓋的方法prepareRecipe(),用於沖泡飲料的功能
public abstract class Beverage { final void prepareRecipe() { // final 表示希望子類不能覆蓋此方法 boilWater(); brew(); pourInCup(); addCondiments(); } // 沖泡內容和添加的配料都由子類來實現 abstract void brew(); abstract void addCondiments(); private void pourInCup() { System.out.println("將熱飲倒入杯子"); } private void boilWater() { System.out.println("燒水"); }}
咖啡
// 咖啡的沖泡public class Coffee extends Beverage { @Override void brew() { System.out.println("添加咖啡"); } @Override void addCondiments() { System.out.println("添加方糖"); }}
檸檬綠茶
// 檸檬綠茶沖泡public class Tea extends Beverage { @Override protected void brew() { System.out.println("放入茶葉"); } @Override protected void addCondiments() { System.out.println("加入檸檬片"); }}
沖泡飲料
public static void main(String[] args) { System.out.println("泡咖啡"); Beverage coffee = new Coffee(); coffee.prepareRecipe(); System.out.println("泡檸檬綠茶"); Beverage tea = new Tea(); tea.prepareRecipe(); }
輸出
泡咖啡燒水添加咖啡將熱飲倒入杯子添加方糖泡檸檬綠茶燒水放入茶葉將熱飲倒入杯子加入檸檬片
更多模式: 一天一個設計模式—分類與六大原則
更多源碼: https://github.com/oDevilo/Java-Base