設計模式(十八)---模板方法模式
阿新 • • 發佈:2017-09-14
strac string package style prim res 不同的 好的 clas
1、簡介
模板方法模式是類的行為模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,然後聲明一些抽象方法來迫使子類實現剩余的邏輯。
不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。這就是模板方法模式的用意。
2、模板方法結構
模板方法模式是所有模式中最為常見的幾個模式之一,是基於繼承的代碼復用的基本技術。
代表這些具體邏輯步驟的方法稱做基本方法(primitive method);而將這些基本方法匯總起來的方法叫做模板方法(template method),這個設計模式的名字就是從此而來。
模板方法所代表的行為稱為頂級行為,其邏輯稱為頂級邏輯。
3、模板方法類圖
4、模板方法涉及的角色
4.1、抽象模板角色:定義了一個或多個抽象操作,以便讓子類實現。這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟,定義並實現了一個模板方法。
這個模板方法一般是一個具體方法,它給出了一個頂級邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯也有可能調用一些具體方法。
4.2、具體模板角色:實現父類所定義的一個或多個抽象方法,它們是一個頂級邏輯的組成步驟。每一個抽象模板角色都可以有任意多個具體模板角色與之對應,
而每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏輯的實現各不相同。
5、源代碼
5.1、抽象模板角色
package TemplateMethod; /** * ******************************************************** * @ClassName: AbstractPerson * @Description: 抽象模板角色 * ********************************************************** */ public abstract class AbstractPerson { //抽象類定義整個流程骨架 public voidprepareGotoSchool(){ dressUp(); eatBreakfast(); takeThings(); } //以下是不同子類根據自身特性完成的具體步驟 protected abstract void dressUp(); protected abstract void eatBreakfast(); protected abstract void takeThings(); }
5.2、具體模板角色1
package TemplateMethod; /** * ******************************************************** * @ClassName: ConcreteClass * @Description: 具體模板角色 * ********************************************************** */ public class Student extends AbstractPerson{ @Override protected void dressUp() { System.out.println("穿校服"); } @Override protected void eatBreakfast() { System.out.println("吃媽媽做好的早飯"); } @Override protected void takeThings() { System.out.println("背書包,帶上家庭作業和紅領巾"); } }
5.3、具體模板角色2
package TemplateMethod; /** * ******************************************************** * @ClassName: Teacher * @Description: 具體模板類 * ********************************************************** */ public class Teacher extends AbstractPerson{ @Override protected void dressUp() { System.out.println("穿工作服"); } @Override protected void eatBreakfast() { System.out.println("做早飯,照顧孩子吃早飯"); } @Override protected void takeThings() { System.out.println("帶上昨晚準備的考卷"); } }
5.4、測試客戶端
package TemplateMethod; /** * ******************************************************** * @ClassName: Client * @Description: 模板方法模式測試客戶端 * ********************************************************** */ public class Client { public static void main(String[] args) { Student student = new Student(); student.prepareGotoSchool(); Teacher teacher = new Teacher(); teacher.prepareGotoSchool(); } }
6、測試,運行結果如下
7、總結
子類可以置換掉父類的可變部分,但是子類卻不可以改變模板方法所代表的頂級邏輯。
設計模式(十八)---模板方法模式