/*
在軟體開發中,有時會遇到類似的情況:某個方法的實現需要多個步驟,其中有些步驟是固定的;而有些步驟並不固定,存在可變性。
為了提高**的復用性和系統的靈活性,可以使用模板方法模式來應對這類情況。
定義:定義乙個操作中的演算法框架,而將一些步驟延遲到子類中,使得子類不改變乙個演算法的結構即可重定義演算法的某些特定步驟。
模板方法模式中有如下角色:
abstractclass:抽象類,定義了一套演算法框架。
concreteclass:具體實現類。
*//*
模板方法的簡單實現
模板方法實際就是封裝固定的流程,像模板一樣,第一步做什麼,第二步又做什麼,都在抽象類中定義好。子類可以有不同的演算法實現,在演算法框架不被修改的前提下實現某些步驟的演算法替換。
*//*
建立抽象類,定義演算法框架
接著舉武俠的例子:
乙個武俠要戰鬥的時候,也有一套固定的通用模式,那就是執行內功、開啟經脈、準備**和使用招式。
我們把這些用**表示:
*/public abstract class abstractswordsman
// 使用招式
moves();
// 鉤子方法
hook(); // 1
} // 空實現方法
protected void hook() {}
protected abstract void neigong();
protected abstract void weapons();
protected abstract void moves();
protected void meridian()
/*** 是否有**,預設是有**的,鉤子方法
* @return
*/ protected boolean hasweapons() }/*
這個抽象類包含了3種型別的方法,分別是抽象方法、具體方法和鉤子方法。
抽象方法是交由子類去實現的,具體方法則是父類實現了子類公共的方法。在上面的例子中就是武俠開啟經脈的方式都一樣,所以就在具體方法中實現。
鉤子方法則分兩類:
第一類在上面**注釋1處,它有乙個空實現的方法,子類可以視情況來決定是否要覆蓋它;
第二類在注釋2處,這類鉤子方法的返回型別通常是boolean型別的,其一般用於對某個條件進行判斷,如果條件滿足則執行某一步驟,否則將不執行。
*//*
具體實現類
武俠就拿張無忌、張三丰來作為例子,**如下所示:
*/public class zhangwuji extends abstractswordsman
@override
protected void weapons()
@override
protected void moves()
@override
protected boolean hasweapons() }/*
張無忌沒有**,所以hasweapons方法返回false,這樣也不會進入weaponse方法了。
接下來看張三丰的**:
*/public class zhangsanfeng extends abstractswordsman
@override
protected void weapons()
@override
protected void moves()
@override
protected void hook() }/*
最後,張三丰突然感覺肚子不舒服,所以就實現了鉤子方法hook,用來處理一些自定義的邏輯。
*//*
客戶端呼叫
*/protected class client }/*
模板方法模式的使用場景和優缺點
使用場景:
多個子類有共有的方法,並且邏輯基本相同時。
面對重要、複雜的演算法,可以把核心演算法設計為模板方法,周邊相關細節功能則由各個子類實現。
需要通過子類來決定父類演算法中的某個步驟是否執行,實現子類對父類的反向控制。
優點:模板方法模式通過把不變的行為遷移到父類,去除了子類中的重複**。
子類實現演算法的某些細節,有助於演算法的擴充套件。
缺點:每個不同的實現都需要定義乙個子類,這會導致類的個數的增加,設計更加抽象。
*/
以上學習於android高階之光 模板設計模式 設計模式 模板方法模式
在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。首先需要一定抽象的定義,沒有具體的實現,但是在抽象類的行為中,子類去程序這個抽象類,重寫抽象方法,實現不...
設計模式 模板方法設計模式
物件導向,萬物皆物件,用乙個雷來反應現實生活中的東西。比如銀行系統,業務公升級 活期 定期,差別很小,就加判斷 違背單一職責 差別比較多,尤其是模擬較複雜,型別拆分下。拆分之後,自然就有父類,重用。利率 每個客戶端都有利率,但是各不一樣 抽象方法。show 不分客戶端是一樣的,個別客戶端是不一樣的 ...
設計模式 模板方法模式
模板方法模式 類庫中大量使用,例如idbconnection介面 dbconnection抽象類 派生的sqlconnection和派生的oledbconnection就是使用了這種方法 1。介面,到能做的定義進來。一種規範 2.把共同的部分進去分離出來,放到乙個抽象的父類去實現.3.子類中實現 不...