模板方式很是簡單,可是它是一個應用很是普遍的模式。模式中會定義一個操做中的算法骨架,將一些步驟延遲到子類中。模式中僅僅使用Java的繼承機制,使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。java
好比咱們定義一個抽象類AbstractClass 也叫抽象模板角色,它的方法分爲以下幾類:算法
(1)基本方法--抽象的方法框架
基本方法也稱爲基本操做,是由子類實現的方法,而且在模板中被調用。ide
(2)模板方法測試
模板方法也就是骨架,能夠有多個骨架,通常是一個具體方法,實現對基本方法的調度,完成固定的邏輯。爲了防止惡意的操做,通常模板方法都加上final關鍵字,不容許被複寫。設計
(3)鉤子方法code
鉤子方法是由抽象類聲明並加以實現。可是子類能夠去擴展,子類能夠經過擴展鉤子方法來影響模板方法的邏輯。抽象類的任務是搭建邏輯的框架,一般由經驗豐富的人員編寫,由於抽象類的好壞直接影響決定程序的穩定。繼承
例如創建一個骨架的演示代碼以下所示:鉤子
package com.wbx.design; import java.util.Scanner; public abstract class Template { String name = "Laughing"; private Scanner in; //final 不容許子類改動其框架 final public void pre(){ name(); if(is()) other(); //用鉤子技術控制是否要這一個other步驟 } public void name(){ System.out.println(name); } public abstract void other(); public boolean is(){ in = new Scanner(System.in); String str = in.nextLine(); if("yes".equals(str)) return true; return false; } }
接下來分別寫兩個子類,並實現abstract方法。例以下面的演示代碼:模板
package com.wbx.design; public class Liu extends Template { @Override public void other() { // TODO Auto-generated method stub System.out.println("Liu"); } }
package com.wbx.design; public class Ju extends Template { @Override public void other() { // TODO Auto-generated method stub System.out.println("ju"); } }
接下來客戶端測試
Template l = new Liu(); Template j = new Ju(); l.pre(); j.pre();
結果以下
Laughing yes Liu Laughing yes ju
模版方法的優勢及適用場景
容易擴展。通常來講,抽象類中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,所以經過增長實現類通常能夠很容易實現功能的擴展,符合開閉原則。
便於維護。對於模版方法模式來講,正是因爲他們的主要邏輯相同,才使用了模版方法,假如不使用模版方法,任由這些相同的代碼散亂的分佈在不一樣的類中,維護起來是很是不方便的。
比較靈活。由於有鉤子方法,所以,子類的實現也能夠影響父類中主邏輯的運行。可是,在靈活的同時,因爲子類影響到了父類,違反了里氏替換原則,也會給程序帶來風險。這就對抽象類的設計有了更高的要求。
在多個子類擁有相同的方法,而且這些方法邏輯相同時,能夠考慮使用模版方法模式。在程序的主框架相同,細節不一樣的場合下,也比較適合使用這種模式