模板方法模式(Template Method Pattern):定義一個操做中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。模板方法是一種類行爲型模式。算法
從模型圖來看,模板方法模式很簡單,可是很經常使用。抽象模板(AbstractClass)中的方法基本分兩類:設計模式
而具體模板(ConcreteClass)主要是實現父類定義的抽象的基本方法。微信
例子:給兩種手機作測試的,測試包括「開機,檢查,關機」三種操做。下面用具體的代碼來講明:ide
1.抽象類測試
public abstract class TestModel { //開機 protected abstract void open(); //檢查 protected abstract void check(); //關閉 protected abstract void close(); //模板方法-測試 public void test(){ this.open();; this.check(); this.close(); } }
2.兩個實現類Phone1,Phone2this
public class Phone1 extends TestModel { @Override protected void open() { System.out.println("phone1的開機邏輯"); } @Override protected void check() { System.out.println("phone1的檢查邏輯"); } @Override protected void close() { System.out.println("phone1的關機邏輯"); } } public class Phone2 extends TestModel { @Override protected void open() { System.out.println("phone2的開機邏輯"); } @Override protected void check() { System.out.println("phone2的檢查邏輯"); } @Override protected void close() { System.out.println("phone2的關機邏輯"); } }
3.調用spa
TestModel testModel1=new Phone1(); TestModel testModel2=new Phone2(); testModel1.test(); testModel2.test();
運行的結果以下:設計
二.擴展code
若是phone1在測試中須要關機,而phone2不須要關機,這時須要一個鉤子方法。rem
1.抽象類
public abstract class TestModel { //開機 protected abstract void open(); //檢查 protected abstract void check(); //關閉 protected abstract void close(); //模板方法-測試 public void test(){ this.open();; this.check(); if (isClose()){ this.close(); } } //鉤子方法,默認是關機 protected boolean isClose(){ return true; } }
2.實現類
public class Phone1 extends TestModel { public boolean isClose=true; public void setIsClose(boolean isClose){ this.isClose=isClose; } protected boolean isClose(){ return this.isClose; } @Override protected void open() { System.out.println("phone1的開機邏輯"); } @Override protected void check() { System.out.println("phone1的檢查邏輯"); } @Override protected void close() { System.out.println("phone1的關機邏輯"); } } public class Phone2 extends TestModel { @Override protected void open() { System.out.println("phone2的開機邏輯"); } @Override protected void check() { System.out.println("phone2的檢查邏輯"); } @Override protected void close() { System.out.println("phone2的關機邏輯"); } //由於是取消關機,因此直接返回false就能夠了 protected boolean isClose(){ return false; } }
3.調用
Phone1 testModel1=new Phone1(); Phone2 testModel2=new Phone2(); //phone1 testModel1.setIsClose(true); testModel1.test(); //phone2 testModel2.test()
1.優勢
2.缺點
3.應用
參考資料《大話設計模式》《設計模式之禪》
歡迎你們關注個人微信公衆號:安卓乾貨鋪