前幾天遇到了小明,
相互寒暄了下,感嘆了下時間過得很快,畢業後好些同學都沒聯絡了,然後巴拉巴拉從小學、初中、高中、大學簡單回憶了一下上學時候的有趣的事情……
如果用類圖來描述小明的學習生涯,可以簡單描述為:
如果用程式來描述學習的各個階段,可以簡單表示為:
public小明的學習經歷可以簡單描述為:abstract
class
learn
}
publicclass xiaominglearn extends
learn
@override
public
void
gomiddleschool()
@override
public
void
gohignschool()
@override
public
void
gouniversity()
}
@testpublic
void
testtemplatemethod()
6 years primary school上面一段程式在抽象類learn 裡定義了上學的各個階段(抽象方法是因為每個人的學習階段各不相同),learnexp裡按時間先後對各個階段進行了先後排序,有相關經歷的人只需要繼承learn,對自己各個階段個性化實現,然後就可以通過learnexp向別人講述自己的上學經歷。其實這就是乙個標準的模板方法模式,來看一下模板方法的定義:3 years middle school
3 years high school
4 years university school
上面例子只是乙個標準的模板方法,對於老王而言,初中的時候已經自學完了高中的課程,根本沒上過高中,初中畢業直接被大學免試招生了,老王向別人講述(吹起)自己上學的經歷就沒有高中的階段。對於這種情況,可以在學習流程裡內建乙個是否需要上高中的狀態,然後在模板方法裡(learnexp方法)根據狀態來判斷是否調有高中階段即可。用類圖簡單描述為:
learn抽象方法稍加改造,新增了乙個是否需要上高中的標識(isneedhighschool)並提供預設值,標識可由子類根據需要覆蓋:
public老王的牛逼上學經歷:abstract
class
learn
gouniversity();
}protected boolean isneedhighschool()
}
public老王講述自己的經歷:class laowanglearn extends
learn
@override
public
void
gomiddleschool()
@override
public
void
gohignschool()
@override
public
void
gouniversity()
@override
protected boolean isneedhighschool()
}
@testpublic
void
testlaowang()
6 years primary school小明和老王講述的方法相同,卻有不同的經歷。3 years middle school
4 years university school
同樣的流程,同樣的方法,不同的執行過程,這就是模板方法的變種方式,isneedhighschool就是鉤子方法,
子類重寫鉤子方法改變父類的執行過程。
定義乙個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變乙個演算法的結構即可重新定義該演算法的某些特定步驟。
上述老王和小明對應模板方法結構圖為:
主要解決:一些方法通用,卻在每乙個子類都重新寫了這一方法。
何時使用:有一些通用的方法。
如何解決:將這些通用演算法抽象出來。
關鍵**:在抽象類實現,其他步驟在子類實現。
應用例項:比如開啟事務、獲取 session、關閉 session 等,程式設計師不重複寫那些已經規範好的**,直接丟乙個實體就可以儲存。
優點:1、封裝不變部分,擴充套件可變部分。 2、提取公共**,便於維護。 3、行為由父類控制,子類實現。
缺點:每乙個不同的實現都需要乙個子類來實現,導致類的個數增加,使得系統更加龐大。
使用場景:1、有多個子類共有的方法,且邏輯相同。 2、重要的、複雜的方法,可以考慮作為模板方法。
模板設計模式 設計模式 模板方法模式
在模板模式 template pattern 中,乙個抽象類公開定義了執行它的方法的方式 模板。它的子類可以按需要重寫方法實現,但呼叫將以抽象類中定義的方式進行。這種型別的設計模式屬於行為型模式。首先需要一定抽象的定義,沒有具體的實現,但是在抽象類的行為中,子類去程序這個抽象類,重寫抽象方法,實現不...
設計模式 模板方法設計模式
物件導向,萬物皆物件,用乙個雷來反應現實生活中的東西。比如銀行系統,業務公升級 活期 定期,差別很小,就加判斷 違背單一職責 差別比較多,尤其是模擬較複雜,型別拆分下。拆分之後,自然就有父類,重用。利率 每個客戶端都有利率,但是各不一樣 抽象方法。show 不分客戶端是一樣的,個別客戶端是不一樣的 ...
設計模式 模板方法模式
模板方法模式 類庫中大量使用,例如idbconnection介面 dbconnection抽象類 派生的sqlconnection和派生的oledbconnection就是使用了這種方法 1。介面,到能做的定義進來。一種規範 2.把共同的部分進去分離出來,放到乙個抽象的父類去實現.3.子類中實現 不...