前面咱們聊了:
什麼是設計模式?你知道多少?
你必須知道的六大設計原則
第一個設計模式,我是皇帝我獨苗,單例模式
第二個設計模式,工廠方法模式
第三個設計模式,抽象工廠模式
這個真的很枯燥啊,你們參與的不多,可是你只要按格式認真參與,獲得獎品的機會可能更高哦!
今天咱們來聊聊第四個設計模式,模板方法模式。
模板方法模式:定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。使得子類能夠不改變算法的結構便可重定義該算法的某些特定步驟。(Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure)算法
看了定義恐怕會很頭大,下面是通俗一點的:
在軟件開發過程當中,若是相同的一段代碼複製過兩次,就須要對設計產生懷疑,架構師要明確地說明爲何相同的邏輯要出現兩次或更屢次。
封裝算法,將相同的代碼封裝到一個方法中,這就是模板方法模式。設計模式
public abstract class AbstractClass { protected abstract void doAnything(); protected abstract void doSomething(); protected boolean isDoSomething(){ //父類方法返回真 return true; } public final void templateMethod(){ /* * 調用基本方法,完成相關的邏輯 */ this.doAnything(); if(this.isDoSomething()) this.doSomething(); } } public class ConcreteClass1 extends AbstractClass { private boolean isDoSth; @Override protected void doAnything() { // TODO Auto-generated method stub //子類實現具體 } @Override protected void doSomething() { // TODO Auto-generated method stub } protected void setDo(boolean isDo){ this.isDoSth = isDo; } @Override protected boolean isDoSomething(){ return isDoSth; } } public class ConcreteClass2 extends AbstractClass { @Override protected void doAnything() { // TODO Auto-generated method stub //子類實現具體 } @Override protected void doSomething() { // TODO Auto-generated method stub } }
這個模式是用來建立一個算法的模板。什麼是模板?如你所見的,模板就是一個方法。更具體地說,這個方法將算法定義成一組步驟,其中的任何步驟均可以是抽象的,由子類負責實現。這能夠確保算法的結構保持不變,同時由子類提供部分實現。架構
模板方法模式的優勢
封裝不變部分,擴展可變部分。把認爲不變部分的算法封裝到父類中實現,而可變部分的則能夠經過繼承來繼續擴展。
提取公共部分代碼,便於維護。
行爲由父類控制,子類實現。
模板方法模式的缺點
按照設計習慣,抽象類負責聲明最抽象、最通常的事物屬性和方法,實現類負責完成具體的事務屬性和方法,可是模板方式正好相反,子類執行的結果影響了父類的結果,會增長代碼閱讀的難度。
模板方法模式的使用場景
多個子類有共有的方法,而且邏輯基本相同時。
重要、複雜的算法,能夠把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現。
重構時,模板方法是一個常常使用的方法,把相同的代碼抽取到父類中,而後經過構造函數約束其行爲。ide
今天的話題:
一、通常模板方法都會加上一個關鍵字,你知道是什麼嗎?做用目的是什麼?函數
二、模板方法模式能夠擴展,使用鉤子,你能指出示例中對應功能的代碼嗎?this
三、有一個設計模式和模板方法模式很像,你知道它是什麼模式嗎?它們有什麼類似與不一樣?設計
點擊連接去參與話題,認真回覆就可能得到如下獎品哦!code