亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

設(shè)計模式之模板方法模式

系統(tǒng) 2084 0

一. 模式概述

????? 模板方法(Template Method)模式是一種非常簡單而又經(jīng)常使用的設(shè)計模式.先創(chuàng)建一個父類,把其中的一個或多個方法留給子類去實(shí)現(xiàn),這實(shí)際上就是在使用模板模式.所謂的模板模式可以這樣來理解:"在一個類中定義一個算法,但將此算法的某些細(xì)節(jié)留到子類中去實(shí)現(xiàn).換句話說,基類是一個抽象類,那么你就是在使用一種簡單形式的模板模式."

????? 更近一步可以這樣來理解:"準(zhǔn)備一個抽象類,將部分邏輯以具體方法的形式實(shí)現(xiàn),然后申明一些抽象方法來 迫使 子類實(shí)現(xiàn)剩余的邏輯.不同的子類可以以不同的方法實(shí)現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實(shí)現(xiàn)."

?

?????

準(zhǔn)備一個抽象類,將部分邏輯以具體方法以及具體構(gòu)造子的形式實(shí)現(xiàn),然后聲明一些抽象方法迫使子類實(shí)現(xiàn)剩余的邏輯。不同的子類以不同的方式實(shí)現(xiàn)這些抽象方法,從而對剩余的邏輯有不同的實(shí)現(xiàn)。

???? 模板方法的核心是基于繼承的代碼復(fù)用的基本技術(shù),模板方法模式結(jié)果和用法也是面向?qū)ο笤O(shè)計的核心。 模板方法模式需要開發(fā)抽象類和具體子類的設(shè)計師之間的協(xié)作。一個設(shè)計師負(fù)責(zé)給出一個算法的輪廓和骨架,另一個設(shè)計師則負(fù)責(zé)給出這個算法的各個邏輯步驟。代表這些具體邏輯步驟的方法叫做基本方法;而將這些基本方法總匯起來的方法叫做模板方法。

??? 模板方法代表的行為成為頂級行為,其邏輯稱為頂級邏輯。

????? 二. 模式意圖

?

????? 將一個類的基本部分抽取出來放到一個基類中,這樣它就不必重復(fù)出現(xiàn)在幾個派生類里.

?

三. 模式UML圖 (下圖轉(zhuǎn)自 http://www.dofactory.com/ )

??????????????????????????? ? 設(shè)計模式之模板方法模式
四. 模式結(jié)構(gòu)與參與者

??? ? ? 抽象模板角色 ?

?????? 1. 定義了一個或多個抽象操作 , 以便讓子類實(shí)現(xiàn) . 這些抽象操作叫做基本操作,它們是一個頂級邏輯的組成步驟。

??????? 2. 定義并實(shí)現(xiàn)了一個模板方法。這個模板方法一般是由一個具體方法,它給出了一個頂級邏輯的骨架。而邏輯?

????????組成步驟在相應(yīng)的抽象操作中,推遲到子類實(shí)現(xiàn)。頂級邏輯有可能要調(diào)用一些具體方法。

??? 具體模板角色 :

??????? 1. 實(shí)現(xiàn)父類所定義的一個或多個抽象方法。他們是一個頂級邏輯的組成步驟。

??????? 2. 每一個抽象模板角色都可以有任意多個具體模板角色與之對應(yīng)。

??????3.每一個具體模板角色都可以給出這些抽象方法(也就是頂級邏輯的組成步驟)的不同實(shí)現(xiàn),從而使得頂級邏

??????? 輯的實(shí)現(xiàn)各不相同。

五. 模式中的方法種類

????1. 抽象模板角色里提供完整的方法,它完成了所有派生類都要用到的一些基本功能.

??? 2. 抽象模板角色里只提供空方法,把功能全部留給派生類去實(shí)現(xiàn).

??? 3. 抽象模板角色里只包含某些操作的默認(rèn)實(shí)現(xiàn),派生類里可以重新定義這些方法的實(shí)現(xiàn).

????4. 抽象模板角色里模板方法,他是一個調(diào)用抽象方法,鉤子方法以及具體方法的各種組合.

?

六. 造電腦的示例

????? 首先來看一張圖片:

????????????????? ? 設(shè)計模式之模板方法模式 ?????

????? 不用我說,大家都知道,一臺電腦(參考上圖)的基本組成部分包括的硬件主要有CUP,主板,硬盤,顯卡以及內(nèi)存等.OK,現(xiàn)在的需求就是要去造一臺電腦,可計算機(jī)生產(chǎn)商有沒給我們提供生產(chǎn)電腦的方法(MackPC)呢?沒有吧,那么我們自己來定義一個總可以吧(聽起好象有點(diǎn)夸張,呵呵,怎么生產(chǎn)電腦的方法也可以自己定義了,那不是自己就可以生產(chǎn)電腦了,可不是呢,這里只是定義了一個生產(chǎn)電腦的程序方法罷).OK,Go!

?

?1 namespace ?DesignPattern.TemplateMethod.Computer
?2 {
?3 ???? /// ? <summary>
?4 ???? /// ?抽象模板角色
?5 ???? /// ?定義了一個或多個抽象操作,以便讓子類實(shí)現(xiàn)。
?6 ???? /// ?定義并實(shí)現(xiàn)了一個模板方法。
?7 ???? /// ? </summary>

?8 ???? public ? abstract ? class ?Template
?9 ???? {
10 ???????? protected ?String?pcType;
11 ???????? public ?Template(String?pcType)
12 ???????? {
13 ???????????? this .pcType? = ?pcType;
14 ????????}

15
16 ???????? // 留給子類去實(shí)現(xiàn)(抽象操作)
17 ???????? protected ? abstract ? void ?MakeCUP(String?pcType);
18 ???????? protected ? abstract ? void ?MakeMainBorad(String?pcType);
19 ???????? protected ? abstract ? void ?MakeHD(String?pcType);
20
21 ???????? private ?? void ?MakeOver(String?pcType)?
22 ???????? {
23 ???????????Console.WriteLine(pcType? + ? " 造好了! " );
24 ????????}

25 ????
26 ???????? /// ? <summary>
27 ???????? /// ?模板方法
28 ???????? /// ? </summary>

29 ???????? public ?? void ?MakePC()
30 ???????? {
31 ????????????MakeCUP(pcType);
32 ????????????MakeMainBorad(pcType);
33 ????????????MakeHD(pcType);
34
35 ????????????MakeOver(pcType);
36 ????????}

37 ????}

38 }

?

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

?

?1 namespace ?DesignPattern.TemplateMethod.Computer
?2 {
?3 ???? /// ? <summary>
?4 ???? /// ??具體模板角色
?5 ???? /// ??實(shí)現(xiàn)父類所定義的一個或多個抽象方法。
?6 ???? /// ??每一個抽象模板角色都可以有任意多個具體模板角色與之對應(yīng),而每一個具體模板角色都可以給出這些抽象方法的不同實(shí)現(xiàn)。
?7 ???? /// ? </summary>

?8 ???? public ? class ?NotePc?:?Template
?9 ???? {
10 ???????? public ?NotePc( string ?pcType)
11 ????????????:? base (pcType)
12 ???????? {?}
13
14 ???????? protected ? override ? void ?MakeCUP( string ?pcType)
15 ???????? {
16 ????????????Console.WriteLine(pcType? + ? " 的CPU造好了 " );
17 ????????}

18
19 ???????? protected ? override ? void ?MakeMainBorad( string ?pcType)
20 ???????? {
21 ????????????Console.WriteLine(pcType? + ? " 的硬盤造好了 " );
22 ????????}

23
24 ???????? protected ? override ? void ?MakeHD( string ?pcType)
25 ???????? {
26 ????????????Console.WriteLine(pcType? + ? " 的主板造好了 " );
27 ????????}

28 ????}

29 }

???? NotePC作為模式參與者中的具體模板角色,實(shí)現(xiàn)了抽象模板角色(Template)里的抽象方法.

????

??????OK,到這里抽象模板(Template)和具體模板(NotePC)都已經(jīng)準(zhǔn)備好了.可說是"萬事具備,只欠命令"了,那么,現(xiàn)在就對模板下放一命令,讓其制造一"筆記本"電腦出來.

?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 }

?

程序運(yùn)行結(jié)果如下:

?

??????? ? 設(shè)計模式之模板方法模式

?

七. 典型的模板方法應(yīng)用

???1. HttpServlet技術(shù)

?????? HttpServlet類提供了一個service()方法.這個方法調(diào)用了一個或是多個do方法,完成對客戶端發(fā)起的請求的處理,這些do方法則是由具體的HttpServlet類提供的.那么這里的service()方法就是一個模板方法.

?

注:轉(zhuǎn)載請注明出處: ? http://beniao.cnblogs.com/ ? 或? ? http://www.cnblogs.com/ ?? 作者:beniao

?

設(shè)計模式之模板方法模式


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 99精品一区二区免费视频 | 九九热在线观看 | 国产成人做受免费视频 | 久久国产精品高清一区二区三区 | 精品一区二区免费视频 | 一区二区三区高清不卡 | a级毛片免费 | jizzjizz成熟丰满老妇 | 久久国产亚洲高清观看5388 | 加勒比色综合 | 日本色综合 | 国产一级一级毛片 | 一级毛片在线观看免费 | 国产高清精品一级毛片 | 色婷婷色99国产综合精品 | 午夜色影院| 久久精品国产99久久99久久久 | 一级国产精品一级国产精品片 | 久久香蕉综合精品国产 | 国产九九免费视频网站 | 伊人网五月天 | 亚久久| 久精品视频村上里沙 | 久久国产欧美另类久久久 | 曰本毛片 | 欧美又黄又嫩大片a级 | 亚洲精品1区 | 久久欧美精品欧美久久欧美 | 91粉嫩萝控精品福利网站 | 亚洲狼人综合干 | 99久久综合九九亚洲 | 亚洲精品日本 | 色天天色综合 | 国产亚洲视频在线观看 | 国产在线视频资源 | 97久久精品国产精品青草 | 一区二区三区免费精品视频 | 久久伊人中文字幕有码 | 日本老年人精品久久中文字幕 | 成年人免费在线视频 | 老司机观看精品一区二区 |