模板模式
模板模式通常又叫模板方法模式(Template Method Pattern)是指定義一個(gè)算法的骨架,并允許子類為一個(gè)或者多個(gè)步驟提供實(shí)現(xiàn)焕数。模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下纱昧,重新定義算法的某些步驟,屬于行為性設(shè)計(jì)模式堡赔。模板方法適用于以下應(yīng)用場景:
一次性實(shí)現(xiàn)一個(gè)算法的不變的部分识脆,并將可變的行為留給子類來實(shí)現(xiàn)。
各子類中公共的行為被提取出來并集中到一個(gè)公共的父類中善已,從而避免代碼重復(fù)灼捂。
這里還是以平時(shí)開發(fā)的流程來舉例,這里是開發(fā)時(shí)常接觸的一些大體的流程:
- 需求評(píng)審
- 需求變更(這里是可變的)
- 設(shè)計(jì)文檔編寫
- 開發(fā)
- 測試
- 發(fā)布
實(shí)例
- UML類圖
-
工作流程頂層抽象
public abstract class Workflow { protected void write(){ //1. 需求評(píng)審 this.requirementReview(); //2. 需求變更(這里是可變的) if(needChange()){ this.requirementChange(); } //3. 設(shè)計(jì)文檔編寫 this.writeDesignDoc(); //4. 開發(fā) this.code(); //5. 測試 this.test(); //6. 發(fā)布 this.launch(); } //鉤子方法换团,實(shí)現(xiàn)對流程的微調(diào) protected boolean needChange() { return false; } private void launch() { System.out.println("功能發(fā)布"); } private void test() { System.out.println("測試"); } private void code() { System.out.println("寫代碼"); } private void writeDesignDoc() { System.out.println("編寫設(shè)計(jì)文檔"); } protected abstract void requirementChange(); private void requirementReview() { System.out.println("需求評(píng)審"); } }
-
個(gè)人中心功能
public class UserModule extends Workflow { @Override protected void requirementChange() { System.out.println("需求變更:開發(fā)用戶模塊需要支持個(gè)人信息同步至CRM系統(tǒng)"); } }
-
訂單功能
public class OrderModule extends Workflow { private boolean needChange; public OrderModule (boolean needChange){ this.needChange = needChange; } //需求變更 @Override protected void requirementChange() { System.out.println("需求變更:該訂單需求需要支持批量刪除功能"); } @Override protected boolean needChange() { return true; } }
-
測試
public class WorkflowTest { public static void main(String[] args) { //開發(fā)用戶模塊 Workflow workflow = new UserModule(); workflow.write(); System.out.println("==============================="); //開發(fā)訂單模塊 Workflow workflow2 = new OrderModule(true); workflow2.write(); } }
-
輸出
需求評(píng)審 編寫設(shè)計(jì)文檔 寫代碼 測試 功能發(fā)布 =============================== 需求評(píng)審 需求變更:該訂單需求需要支持批量刪除功能 編寫設(shè)計(jì)文檔 寫代碼 測試 功能發(fā)布
上面就是很簡單的一個(gè)關(guān)于模板模式的例子悉稠,說下優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
利用模板方法將相同處理邏輯的代碼放到抽象父類中,可以提高代碼的復(fù)用性艘包。
將不同的代碼不同的子類中的猛,通過對子類的擴(kuò)展增加新的行為,提高代碼的擴(kuò)展性想虎。
把不變的行為寫在父類上卦尊,去除子類的重復(fù)代碼,提供了一個(gè)很好的代碼復(fù)用平臺(tái)舌厨。
符合開閉原則岂却。
缺點(diǎn):
類數(shù)目的增加,每一個(gè)抽象類都需要一個(gè)子類來實(shí)現(xiàn),這樣導(dǎo)致類的個(gè)數(shù)增加淌友。
類數(shù)量的增加煌恢,間接地增加了系統(tǒng)實(shí)現(xiàn)的復(fù)雜度骇陈。
繼承關(guān)系自身缺點(diǎn)震庭,如果父類添加新的抽象方法,所有子類都要改一遍