一. 模式概述
????? 模板方法(Template Method)模式是一種非常簡單而又經常使用的設計模式.先創建一個父類,把其中的一個或多個方法留給子類去實現,這實際上就是在使用模板模式.所謂的模板模式可以這樣來理解:"在一個類中定義一個算法,但將此算法的某些細節留到子類中去實現.換句話說,基類是一個抽象類,那么你就是在使用一種簡單形式的模板模式."
????? 更近一步可以這樣來理解:"準備一個抽象類,將部分邏輯以具體方法的形式實現,然后申明一些抽象方法來 迫使 子類實現剩余的邏輯.不同的子類可以以不同的方法實現這些抽象方法,從而對剩余的邏輯有不同的實現."
?
?????
準備一個抽象類,將部分邏輯以具體方法以及具體構造子的形式實現,然后聲明一些抽象方法迫使子類實現剩余的邏輯。不同的子類以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。
???? 模板方法的核心是基于繼承的代碼復用的基本技術,模板方法模式結果和用法也是面向對象設計的核心。 模板方法模式需要開發抽象類和具體子類的設計師之間的協作。一個設計師負責給出一個算法的輪廓和骨架,另一個設計師則負責給出這個算法的各個邏輯步驟。代表這些具體邏輯步驟的方法叫做基本方法;而將這些基本方法總匯起來的方法叫做模板方法。
??? 模板方法代表的行為成為頂級行為,其邏輯稱為頂級邏輯。
????? 二. 模式意圖
?
????? 將一個類的基本部分抽取出來放到一個基類中,這樣它就不必重復出現在幾個派生類里.
?
三. 模式UML圖 (下圖轉自 http://www.dofactory.com/ )
???????????????????????????
?
四. 模式結構與參與者
???
?
?
抽象模板角色
?
?????? 1. 定義了一個或多個抽象操作 , 以便讓子類實現 . 這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。
??????? 2. 定義并實現了一個模板方法。這個模板方法一般是由一個具體方法,它給出了一個頂級邏輯的骨架。而邏輯?
????????組成步驟在相應的抽象操作中,推遲到子類實現。頂級邏輯有可能要調用一些具體方法。
???
具體模板角色
:
??????? 1. 實現父類所定義的一個或多個抽象方法。他們是一個頂級邏輯的組成步驟。
??????? 2. 每一個抽象模板角色都可以有任意多個具體模板角色與之對應。
??????3.每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實現,從而使得頂級邏
??????? 輯的實現各不相同。
五. 模式中的方法種類
????1. 抽象模板角色里提供完整的方法,它完成了所有派生類都要用到的一些基本功能.
??? 2. 抽象模板角色里只提供空方法,把功能全部留給派生類去實現.
??? 3. 抽象模板角色里只包含某些操作的默認實現,派生類里可以重新定義這些方法的實現.
????4. 抽象模板角色里模板方法,他是一個調用抽象方法,鉤子方法以及具體方法的各種組合.
?
六. 造電腦的示例
????? 首先來看一張圖片:
????? 不用我說,大家都知道,一臺電腦(參考上圖)的基本組成部分包括的硬件主要有CUP,主板,硬盤,顯卡以及內存等.OK,現在的需求就是要去造一臺電腦,可計算機生產商有沒給我們提供生產電腦的方法(MackPC)呢?沒有吧,那么我們自己來定義一個總可以吧(聽起好象有點夸張,呵呵,怎么生產電腦的方法也可以自己定義了,那不是自己就可以生產電腦了,可不是呢,這里只是定義了一個生產電腦的程序方法罷).OK,Go!
?

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

?
???? 在上面的抽象模板角色(Template)里,分別定義了生產CPU(MakeCPU),生產主板(MakeMainBorad)以及生產硬盤(MakeHD)的抽象操作(實際中電腦并不只有這三個組成部分,這里為了更簡單的演示,故只取了這三個主要組成部分作為示例).在這里,MakePC方法則作為模板方法.
?

?2

?3

?4

?5

?6

?7

?8

?9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

???? NotePC作為模式參與者中的具體模板角色,實現了抽象模板角色(Template)里的抽象方法.
????
??????OK,到這里抽象模板(Template)和具體模板(NotePC)都已經準備好了.可說是"萬事具備,只欠命令"了,那么,現在就對模板下放一命令,讓其制造一"筆記本"電腦出來.
?1
namespace
?DesignPattern.TemplateMethod.Computer
?2
{
?3
????
///
?
<summary>
?4
????
///
?簡單的造筆記本模板
?5
????
class
?Client
?6
????
{
?7
????????
public
?
static
?
void
?Main1(
string
[]?args)
?8
????????
{
?9
????????????Template?t?
=
?
new
?NotePc(
"
筆記本
"
);
10
????????????t.MakePC();
11
????????}
12
????}
13
}
?
程序運行結果如下:
?
?
七. 典型的模板方法應用
???1. HttpServlet技術
?????? HttpServlet類提供了一個service()方法.這個方法調用了一個或是多個do方法,完成對客戶端發起的請求的處理,這些do方法則是由具體的HttpServlet類提供的.那么這里的service()方法就是一個模板方法.
?
注:轉載請注明出處: ? http://beniao.cnblogs.com/ ? 或? ? http://www.cnblogs.com/ ?? 作者:beniao
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
