最近在看《Spring實戰第三版》(由於濤神說他的東西又可能要用java作。。),在第五章征服數據庫中遇到了模版方法模式。html
《JAVA與模式》之模板方法模式 —— java_my_life
模板方法模式深度解析 —— LoveLionjava
模版方法模式是類的行爲模式。準備一個抽象類,將部分邏輯以具體方法以及具體構造函數的形式實現,而後聲明一些抽象方法來迫使子類實現剩餘的邏輯。不一樣子類能夠以不一樣方式實現這些抽象方法,從而對剩餘的邏輯有不一樣的實現。算法
定義一個操做中算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。數據庫
模板方法中的方法能夠分爲兩大類:模板方法和基本方法。框架
模板方法所表明的行爲稱爲頂級行爲,其邏輯稱爲頂級邏輯。ide
一個模板方法是定義在抽象類中的,把基本操做方法組合在一塊兒造成一個總算法或者總行爲的方法。函數
一個抽象類能夠有任意多個模板方法,而不限於一個。每一個模板方法均可以調用任意多個具體方法。.net
基本方法能夠分爲三種:抽象方法(Abstract Method)、具體方法(Concrete Method)和鉤子方法(Hook Method)設計
鉤子方法又能夠分爲兩類:code
boolean
型,命名通常以is開頭,默認返回通常爲true,具體子類可重寫這個方法更改判斷條件。一個很無聊的例子:
public class Template1 { //這裏使用內部類只是爲了偷懶 static abstract class Template { public final void exe() { if(isAllowSay()) { say(); } doRun(); } protected boolean isAllowSay() { return true; } protected void doRun(){ } private void say() { System.out.println("lalal"); } } static class Run extends Template { @Override protected boolean isAllowSay() { return false; } @Override protected void doRun(){ System.out.println("running..."); } } static class Say extends Template { @Override protected void doRun(){ System.out.println("running..."); } } public static void main(String[] args) { (new Say()).exe(); System.out.println("------"); (new Run()).exe(); } } /* OUTPUT: lalal running... ------ running... */
須要爲每個基本方法的不一樣實現提供一個子類,若是父類中可變的基本方法太多,將會致使類的個數增長,系統更加龐大,設計也更加抽象,此時,可結合橋接模式來進行設計。