版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第26章模板方法模式劉劉 偉偉.本章教學(xué)內(nèi)容w 模板方法模式 模式動(dòng)機(jī)與定義模式動(dòng)機(jī)與定義 模式結(jié)構(gòu)與分析模式結(jié)構(gòu)與分析 模式實(shí)例與解析模式實(shí)例與解析 模式效果與應(yīng)用模式效果與應(yīng)用 模式擴(kuò)展模式擴(kuò)展.模板方法模式w模式動(dòng)機(jī).模板方法模式w 模式動(dòng)機(jī) 模板方法模式是模板方法模式是基于繼承基于繼承的代碼復(fù)用基本技術(shù),模板方法模式的結(jié)的代碼復(fù)用基本技術(shù),模板方法模式的結(jié)構(gòu)和用法也是面向?qū)ο笤O(shè)計(jì)的核心之一。在模板方法模式中,可以構(gòu)和用法也是面向?qū)ο笤O(shè)計(jì)的核心之一。在模板方法模式中,可以將相同的代碼放在父類(lèi)中,而將不同的方法實(shí)現(xiàn)放在不同的子類(lèi)中將相同的代碼放在父類(lèi)中,而將不同的方法實(shí)現(xiàn)放在不同的子類(lèi)中。
2、 在模板方法模式中,我們需要準(zhǔn)備一個(gè)抽象類(lèi),在模板方法模式中,我們需要準(zhǔn)備一個(gè)抽象類(lèi),將部分邏輯以具體將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn)方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后,然后聲明一些抽象方法來(lái)讓子聲明一些抽象方法來(lái)讓子類(lèi)實(shí)現(xiàn)剩余的邏輯類(lèi)實(shí)現(xiàn)剩余的邏輯。不同的子類(lèi)可以以不同的方式實(shí)現(xiàn)這些抽象方不同的子類(lèi)可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn),法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn),這就是模板方法模式的用意。這就是模板方法模式的用意。模板方法模式體現(xiàn)了面向?qū)ο蟮闹T多重要思想,是一種使用頻率較模板方法模式體現(xiàn)了面向?qū)ο蟮闹T多重要思想,是一種使用頻率較高的模式。高的模
3、式。.模板方法模式w 模式定義模板方法模式模板方法模式(Template Method Pattern):定義一:定義一個(gè)操作中個(gè)操作中算法的骨架算法的骨架,而將一些步驟,而將一些步驟延遲到子類(lèi)延遲到子類(lèi)中,模中,模板方法使得子類(lèi)板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟該算法的某些特定步驟。模板方法是一種。模板方法是一種類(lèi)行為型類(lèi)行為型模式。模式。.模板方法模式w 模式定義Template Method Pattern: Define the skeleton of an algorithm in an operation, def
4、erring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithms structure. Frequency of use: medium.模板方法模式w 模式結(jié)構(gòu).primitiveOperation1();.primitiveOperation2();.primitiveOperation3();.AbstractClassabstract +templateMethod ()primit
5、iveOperation1 ()primitiveOperation2 ()primitiveOperation3 ().ConcreteClass+primitiveOperation1 ()primitiveOperation2 ().模板方法模式w 模式結(jié)構(gòu)模板方法模式包含如下角色:模板方法模式包含如下角色: AbstractClass: 抽象類(lèi)抽象類(lèi) ConcreteClass: 具體子類(lèi)具體子類(lèi) .模板方法模式w 模式分析 模板方法模式是一種類(lèi)的行為型模式,在它的結(jié)構(gòu)圖中模板方法模式是一種類(lèi)的行為型模式,在它的結(jié)構(gòu)圖中只只有類(lèi)之間的繼承關(guān)系,沒(méi)有對(duì)象關(guān)聯(lián)關(guān)系有類(lèi)之間的繼承關(guān)系,沒(méi)有對(duì)
6、象關(guān)聯(lián)關(guān)系。 在模板方法模式的使用過(guò)程中,要求開(kāi)發(fā)抽象類(lèi)和開(kāi)發(fā)具在模板方法模式的使用過(guò)程中,要求開(kāi)發(fā)抽象類(lèi)和開(kāi)發(fā)具體子類(lèi)的設(shè)計(jì)師之間進(jìn)行協(xié)作。一個(gè)設(shè)計(jì)師負(fù)責(zé)給出體子類(lèi)的設(shè)計(jì)師之間進(jìn)行協(xié)作。一個(gè)設(shè)計(jì)師負(fù)責(zé)給出一個(gè)一個(gè)算法的輪廓和骨架算法的輪廓和骨架,另一些設(shè)計(jì)師則,另一些設(shè)計(jì)師則負(fù)責(zé)給出這個(gè)算法的負(fù)責(zé)給出這個(gè)算法的各個(gè)邏輯步驟各個(gè)邏輯步驟。實(shí)現(xiàn)這些具體邏輯步驟的方法稱(chēng)為。實(shí)現(xiàn)這些具體邏輯步驟的方法稱(chēng)為基本方基本方法法(Primitive Method),而將這些基本法方法匯總起來(lái),而將這些基本法方法匯總起來(lái)的方法稱(chēng)為的方法稱(chēng)為模板方法模板方法(Template Method),模板方法模,模板方
7、法模式的名字從此而來(lái)。式的名字從此而來(lái)。 .模板方法模式w 模式分析 模板方法:一個(gè)模板方法是模板方法:一個(gè)模板方法是定義在抽象類(lèi)中的、把基本操定義在抽象類(lèi)中的、把基本操作方法組合在一起作方法組合在一起形成一個(gè)總算法或一個(gè)總行為的方法。形成一個(gè)總算法或一個(gè)總行為的方法。 基本方法:基本方法是基本方法:基本方法是實(shí)現(xiàn)算法各個(gè)步驟的方法實(shí)現(xiàn)算法各個(gè)步驟的方法,是模板,是模板方法的組成部分。方法的組成部分。 抽象方法(Abstract Method) 具體方法(Concrete Method) 鉤子方法(Hook Method):“掛鉤”方法和空方法.模板方法模式w 模式分析 鉤子方法(Hook M
8、ethod)public void template() open(); display(); if(isPrint() print(); public boolean isPrint() return true;.模板方法模式w 模式分析 典型的抽象類(lèi)代碼如下所示:典型的抽象類(lèi)代碼如下所示:public abstract class AbstractClass public void templateMethod() /模板方法模板方法 primitiveOperation1(); primitiveOperation2(); primitiveOperation3(); public vo
9、id primitiveOperation1() /基本方法具體方法 /實(shí)現(xiàn)代碼 public abstract void primitiveOperation2(); /基本方法抽象方法 public void primitiveOperation3() /基本方法鉤子方法 .模板方法模式w 模式分析 典型的具體子類(lèi)代碼如下所示:典型的具體子類(lèi)代碼如下所示:public class ConcreteClass extends AbstractClass public void primitiveOperation2() /實(shí)現(xiàn)代碼 public void primitiveOperation
10、3() /實(shí)現(xiàn)代碼 .模板方法模式w 模式分析在模板方法模式中,由于面向?qū)ο蟮亩鄳B(tài)性,子類(lèi)對(duì)在模板方法模式中,由于面向?qū)ο蟮亩鄳B(tài)性,子類(lèi)對(duì)象在運(yùn)行時(shí)將覆蓋父類(lèi)對(duì)象,子類(lèi)中定義的方法也將象在運(yùn)行時(shí)將覆蓋父類(lèi)對(duì)象,子類(lèi)中定義的方法也將覆蓋父類(lèi)中定義的方法,因此程序在運(yùn)行時(shí),覆蓋父類(lèi)中定義的方法,因此程序在運(yùn)行時(shí),具體子具體子類(lèi)的基本方法將覆蓋父類(lèi)中定義的基本方法類(lèi)的基本方法將覆蓋父類(lèi)中定義的基本方法,子類(lèi)的子類(lèi)的鉤子方法也將覆蓋父類(lèi)的鉤子方法鉤子方法也將覆蓋父類(lèi)的鉤子方法,從而可以,從而可以通過(guò)在通過(guò)在子類(lèi)中實(shí)現(xiàn)的鉤子方法對(duì)父類(lèi)方法的執(zhí)行進(jìn)行約束子類(lèi)中實(shí)現(xiàn)的鉤子方法對(duì)父類(lèi)方法的執(zhí)行進(jìn)行約束,實(shí)現(xiàn)子
11、類(lèi)對(duì)父類(lèi)行為的反向控制實(shí)現(xiàn)子類(lèi)對(duì)父類(lèi)行為的反向控制。.模板方法模式w 模板方法模式實(shí)例與解析實(shí)例一:銀行業(yè)務(wù)辦理流程實(shí)例一:銀行業(yè)務(wù)辦理流程 在銀行辦理業(yè)務(wù)時(shí),一般都包含幾個(gè)基本步驟,首先需要取號(hào)排隊(duì),然后辦理具體業(yè)務(wù),最后需要對(duì)銀行工作人員進(jìn)行評(píng)分。無(wú)論具體業(yè)務(wù)是取款、存款還是轉(zhuǎn)賬,其基本流程都一樣?,F(xiàn)使用模板方法模式模擬銀行業(yè)務(wù)辦理流程。.模板方法模式w 模板方法模式實(shí)例與解析實(shí)例一:銀行業(yè)務(wù)辦理流程實(shí)例一:銀行業(yè)務(wù)辦理流程 takeNumber();transact();evaluate();BankTemplateMethodabstract +takeNumber ()transac
12、t ()evaluate ()process ().: void: void: void: voidDeposit+ transact ().: voidWithdraw+ transact ().: voidTransfer+ transact ().: void.模板方法模式w 模板方法模式實(shí)例與解析實(shí)例一:銀行業(yè)務(wù)辦理流程實(shí)例一:銀行業(yè)務(wù)辦理流程 參考代碼 (Chapter 26 Template Methodsample01)演示演示.模板方法模式w 模板方法模式實(shí)例與解析實(shí)例二:數(shù)據(jù)庫(kù)操作模板實(shí)例二:數(shù)據(jù)庫(kù)操作模板 對(duì)數(shù)據(jù)庫(kù)的操作一般包括連接、打開(kāi)、使用、關(guān)閉等步驟,在數(shù)據(jù)庫(kù)操作模板
13、類(lèi)中我們定義了connDB()、openDB()、useDB()、closeDB()四個(gè)方法分別對(duì)應(yīng)這四個(gè)步驟。對(duì)于不同類(lèi)型的數(shù)據(jù)庫(kù)(如SQL Server和Oracle),其操作步驟都一致,只是連接數(shù)據(jù)庫(kù)connDB()方法有所區(qū)別,現(xiàn)使用模板方法模式對(duì)其進(jìn)行設(shè)計(jì)。.模板方法模式w 模板方法模式實(shí)例與解析實(shí)例二:數(shù)據(jù)庫(kù)操作模板實(shí)例二:數(shù)據(jù)庫(kù)操作模板 connDB();openDB();useDB();closeDB();DBOperatorabstract +connDB ()openDB ()useDB ()closeDB ()process ().: void: void: void:
14、void: voidSQLServerDBOperator+ connDB ().: voidOracleDBOperator+ connDB ().: void.模板方法模式w 模式優(yōu)缺點(diǎn)模板方法模式的優(yōu)點(diǎn)模板方法模式的優(yōu)點(diǎn) 模板方法模式在一個(gè)類(lèi)中形式化地定義算法,而由它的子類(lèi)實(shí)現(xiàn)細(xì)節(jié)的處理。 模板方法模式是一種代碼復(fù)用的基本技術(shù)。 模板方法模式導(dǎo)致一種反向的控制結(jié)構(gòu),通過(guò)一個(gè)父類(lèi)調(diào)用其子類(lèi)的操作,通過(guò)對(duì)子類(lèi)的擴(kuò)展增加新的行為,符合“開(kāi)閉原則”。.模板方法模式w 模式優(yōu)缺點(diǎn)模板方法模式的缺點(diǎn)模板方法模式的缺點(diǎn) 每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類(lèi),這會(huì)導(dǎo)致類(lèi)的個(gè)數(shù)增加,系統(tǒng)更加龐大,設(shè)計(jì)也更加抽
15、象,但是更加符合“單一職責(zé)原則”,使得類(lèi)的內(nèi)聚性得以提高。.模板方法模式w 模式適用環(huán)境在以下情況下可以使用模板方法模式:在以下情況下可以使用模板方法模式: 一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類(lèi)來(lái)實(shí)現(xiàn)。 各子類(lèi)中公共的行為應(yīng)被提取出來(lái)并集中到一個(gè)公共父類(lèi)中以避免代碼重復(fù)。 對(duì)一些復(fù)雜的算法進(jìn)行分割,將其算法中固定不變的部分設(shè)計(jì)為模板方法和父類(lèi)具體方法,而一些可以改變的細(xì)節(jié)由其子類(lèi)來(lái)實(shí)現(xiàn)。 控制子類(lèi)的擴(kuò)展。.模板方法模式w 模式應(yīng)用(1) 模板方法模式廣泛應(yīng)用于框架設(shè)計(jì)(如模板方法模式廣泛應(yīng)用于框架設(shè)計(jì)(如Spring,Struts等)中,等)中,以確保父類(lèi)控制處理流程的邏輯順
16、序以確保父類(lèi)控制處理流程的邏輯順序(如框架的初始化(如框架的初始化)。)。.模板方法模式w 模式應(yīng)用 (2) Java單元測(cè)試工具單元測(cè)試工具JUnit中的中的TestCase類(lèi)的設(shè)計(jì):類(lèi)的設(shè)計(jì):public void runBare() throws Throwable setUp();try runTest();finally tearDown();.模板方法模式w 模式擴(kuò)展關(guān)于繼承的討論關(guān)于繼承的討論 模板方法模式鼓勵(lì)我們恰當(dāng)使用繼承,此模式可以用來(lái)改寫(xiě)一些擁有相同功能的相關(guān)類(lèi),將可復(fù)用的一般性的行為代碼移到父類(lèi)里面,而將特殊化的行為代碼移到子類(lèi)里面。這也進(jìn)一步說(shuō)明,雖然繼承復(fù)用存在一些
17、問(wèn)題,但是在某些情況下還是可以給開(kāi)發(fā)人員帶來(lái)方便,模板方法模式就是體現(xiàn)繼承優(yōu)勢(shì)的模式之一。.模板方法模式w 模式擴(kuò)展好萊塢原則好萊塢原則 在模板方法模式中,子類(lèi)不顯式調(diào)用父類(lèi)的方法,而是通過(guò)覆蓋父類(lèi)的方法來(lái)實(shí)現(xiàn)某些具體的業(yè)務(wù)邏輯,父類(lèi)控制對(duì)子類(lèi)的調(diào)用,這種機(jī)制被稱(chēng)為好萊塢原則(Hollywood Principle),好萊塢原則的定義為:“不要給我們打電話(huà),我們會(huì)給你打電話(huà)不要給我們打電話(huà),我們會(huì)給你打電話(huà)(Dont call us, well call you)”。 在模板方法模式中,好萊塢原則體現(xiàn)在:子類(lèi)不需要調(diào)用父類(lèi),而通過(guò)父類(lèi)來(lái)調(diào)用子類(lèi),將某些步驟的實(shí)現(xiàn)寫(xiě)在子類(lèi)中,由父類(lèi)來(lái)控制整個(gè)過(guò)程
18、。 .模板方法模式w 模式擴(kuò)展鉤子方法的使用鉤子方法的使用 鉤子方法的引入使得子類(lèi)可以控制父類(lèi)的行為。 最簡(jiǎn)單的鉤子方法就是空方法,也可以在鉤子方法中定義一個(gè)默認(rèn)的實(shí)現(xiàn),如果子類(lèi)不覆蓋鉤子方法,則執(zhí)行父類(lèi)的默認(rèn)實(shí)現(xiàn)代碼。 比較復(fù)雜一點(diǎn)的鉤子方法可以對(duì)其他方法進(jìn)行約束,這種鉤子方法通常返回一個(gè)boolean類(lèi)型,即返回true或false,用來(lái)判斷是否執(zhí)行某一個(gè)基本方法。.模板方法模式w 模式擴(kuò)展鉤子方法的使用鉤子方法的使用 參考代碼 (Chapter 26 Template MethodHookMethodDemo)演示演示.本章小結(jié)w 在模板方法模式中,定義一個(gè)操作中算法的骨架,而將一些步驟延遲到子類(lèi)中,模板方法使得子類(lèi)可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。模板方法是一種類(lèi)行為型模式。w 模板方法模式包含兩個(gè)角色:在抽象類(lèi)中定義一系列基本操作,這些基本操作可以是具體的,也可以是抽象的,同時(shí),在抽象類(lèi)中實(shí)現(xiàn)了一個(gè)模板方法,用于定義一個(gè)算法的骨架;具體子類(lèi)是抽象類(lèi)的子類(lèi),用于實(shí)現(xiàn)在父類(lèi)中定義的抽象基本操作以完成子類(lèi)特定算法的步驟,也可以覆蓋在父類(lèi)中實(shí)現(xiàn)的具體基本操作。w 在模板方法模式中,方法可以分為模板方法和基本方法,其中基本方法又可以分為抽象方法、具體方法和鉤子方法,鉤子方法根據(jù)其特點(diǎn)又分為空方法和與實(shí)現(xiàn)算法步驟的基本方法“掛鉤”的方法。.本章小結(jié)w 模板
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 古鎮(zhèn)景區(qū)內(nèi)部便利店租賃合同
- 綠色出行招投標(biāo)文件評(píng)審表
- 地產(chǎn)開(kāi)盤(pán)現(xiàn)場(chǎng)制片協(xié)調(diào)書(shū)
- 休閑娛樂(lè)設(shè)施鋼筋施工合同
- 公司宿舍假期住宿申請(qǐng)流程
- 城市綠化招投標(biāo)文件審核指南
- 大型影劇院改造工程合同會(huì)簽表
- 餐飲成本控制方法
- 汕頭市劇院租賃合同
- 小型企業(yè)財(cái)務(wù)分析指南
- 結(jié)構(gòu)加固改造施工方案
- 《診斷學(xué)》心臟聽(tīng)診
- 藍(lán)色商務(wù)發(fā)展歷程時(shí)間軸PPT模板
- 咽鼓管異常開(kāi)放課件
- 部編版高中語(yǔ)文必修下冊(cè)整本書(shū)閱讀《紅樓夢(mèng)》課件
- GB/T 4358-1995重要用途碳素彈簧鋼絲
- GB/T 31422-2015個(gè)體防護(hù)裝備護(hù)聽(tīng)器的通用技術(shù)條件
- GB/T 15773-2008水土保持綜合治理驗(yàn)收規(guī)范
- GB/T 13738.1-2017紅茶第1部分:紅碎茶
- GB/T 11270.1-2021超硬磨料制品金剛石圓鋸片第1部分:焊接鋸片
- GA 1151-2014火災(zāi)報(bào)警系統(tǒng)無(wú)線(xiàn)通信功能通用要求
評(píng)論
0/150
提交評(píng)論