第6章-模板方法模式_第1頁
第6章-模板方法模式_第2頁
第6章-模板方法模式_第3頁
第6章-模板方法模式_第4頁
第6章-模板方法模式_第5頁
已閱讀5頁,還剩22頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、本章教學(xué)內(nèi)容w 模板方法模式 模式動(dòng)機(jī)與定義模式動(dòng)機(jī)與定義 模式結(jié)構(gòu)與分析模式結(jié)構(gòu)與分析 模式實(shí)例與解析模式實(shí)例與解析 模式效果與應(yīng)用模式效果與應(yīng)用模板方法模式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ì)的核心之一。在模板方法模式中,可以將相同的代碼放在父類中,而將不同的方法實(shí)現(xiàn)放在不同的子類中將相同的代碼放在父類中,而將不同的方法實(shí)現(xiàn)放在不同的子類中。 在模板方法模式中,我們需要準(zhǔn)備一個(gè)抽象類,在模板方法

2、模式中,我們需要準(zhǔn)備一個(gè)抽象類,將部分邏輯以具體將部分邏輯以具體方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn)方法以及具體構(gòu)造函數(shù)的形式實(shí)現(xiàn),然后,然后聲明一些抽象方法來讓子聲明一些抽象方法來讓子類實(shí)現(xiàn)剩余的邏輯類實(shí)現(xiàn)剩余的邏輯。不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方不同的子類可以以不同的方式實(shí)現(xiàn)這些抽象方法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn),法,從而對(duì)剩余的邏輯有不同的實(shí)現(xiàn),這就是模板方法模式的用意。這就是模板方法模式的用意。模板方法模式體現(xiàn)了面向?qū)ο蟮闹T多重要思想,是一種使用頻率較模板方法模式體現(xiàn)了面向?qū)ο蟮闹T多重要思想,是一種使用頻率較高的模式。高的模式。模板方法模式w 模式定義模板方法模式模板方法模式(

3、Template Method Pattern):定義一:定義一個(gè)操作中個(gè)操作中算法的骨架算法的骨架,而將一些步驟,而將一些步驟延遲到子類延遲到子類中,模中,模板方法使得子類板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟該算法的某些特定步驟。模板方法模式w 模式定義Template Method Pattern: Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subc

4、lasses redefine certain steps of an algorithm without changing the algorithms structure. Frequency of use: medium模板方法模式w 模式結(jié)構(gòu)模板方法模式w 模式結(jié)構(gòu)模板方法模式包含如下角色:模板方法模式包含如下角色: AbstractClass: 抽象類 ConcreteClass: 具體子類 模板方法模式w 模式分析 模板方法模式是一種類的行為型模式,在它的結(jié)構(gòu)圖中模板方法模式是一種類的行為型模式,在它的結(jié)構(gòu)圖中只只有類之間的繼承關(guān)系,沒有對(duì)象關(guān)聯(lián)關(guān)系有類之間的繼承關(guān)系,沒有對(duì)象關(guān)聯(lián)

5、關(guān)系。 在模板方法模式的使用過程中,要求開發(fā)抽象類和開發(fā)具在模板方法模式的使用過程中,要求開發(fā)抽象類和開發(fā)具體子類的設(shè)計(jì)師之間進(jìn)行協(xié)作。一個(gè)設(shè)計(jì)師負(fù)責(zé)給出體子類的設(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)這些具體邏輯步驟的方法稱為。實(shí)現(xiàn)這些具體邏輯步驟的方法稱為基本方基本方法法(Primitive Method),而將這些基本法方法匯總起來,而將這些基本法方法匯總起來的方法稱為的方法稱為模板方法模板方法(Template Method),模板方法模,模板方法模式

6、的名字從此而來。式的名字從此而來。 模板方法模式w 模式分析 模板方法:一個(gè)模板方法是模板方法:一個(gè)模板方法是定義在抽象類中的、把基本操定義在抽象類中的、把基本操作方法組合在一起作方法組合在一起形成一個(gè)總算法或一個(gè)總行為的方法。形成一個(gè)總算法或一個(gè)總行為的方法。 基本方法:基本方法是基本方法:基本方法是實(shí)現(xiàn)算法各個(gè)步驟的方法實(shí)現(xiàn)算法各個(gè)步驟的方法,是模板,是模板方法的組成部分。方法的組成部分。 抽象方法抽象方法(Abstract Method) 具體方法具體方法(Concrete Method) 鉤子方法鉤子方法(Hook Method):“掛鉤掛鉤”方法和空方法方法和空方法模板方法模式w 模

7、式分析 鉤子方法鉤子方法(Hook Method)public void template() open(); display(); if(isPrint() print(); public boolean isPrint() return true;模板方法模式w 模式分析 典型的抽象類代碼如下所示:典型的抽象類代碼如下所示:public abstract class AbstractClass public void templateMethod() /模板方法模板方法 primitiveOperation1(); primitiveOperation2(); primitiveOpera

8、tion3(); public void primitiveOperation1() /基本方法具體方法 /實(shí)現(xiàn)代碼 public abstract void primitiveOperation2(); /基本方法抽象方法 public void primitiveOperation3() /基本方法鉤子方法 模板方法模式w 模式分析 典型的具體子類代碼如下所示:典型的具體子類代碼如下所示:public class ConcreteClass extends AbstractClass public void primitiveOperation2() /實(shí)現(xiàn)代碼 public void p

9、rimitiveOperation3() /實(shí)現(xiàn)代碼 模板方法模式w 模式分析在模板方法模式中,由于面向?qū)ο蟮亩鄳B(tài)性,子類對(duì)在模板方法模式中,由于面向?qū)ο蟮亩鄳B(tài)性,子類對(duì)象在運(yùn)行時(shí)將覆蓋父類對(duì)象,子類中定義的方法也將象在運(yùn)行時(shí)將覆蓋父類對(duì)象,子類中定義的方法也將覆蓋父類中定義的方法,因此程序在運(yùn)行時(shí),覆蓋父類中定義的方法,因此程序在運(yùn)行時(shí),具體子具體子類的基本方法將覆蓋父類中定義的基本方法類的基本方法將覆蓋父類中定義的基本方法,子類的子類的鉤子方法也將覆蓋父類的鉤子方法鉤子方法也將覆蓋父類的鉤子方法,從而可以,從而可以通過在通過在子類中實(shí)現(xiàn)的鉤子方法對(duì)父類方法的執(zhí)行進(jìn)行約束子類中實(shí)現(xiàn)的鉤子方法

10、對(duì)父類方法的執(zhí)行進(jìn)行約束,實(shí)現(xiàn)子類對(duì)父類行為的反向控制實(shí)現(xiàn)子類對(duì)父類行為的反向控制。模板方法模式w 模板方法模式實(shí)例與解析實(shí)例一:銀行業(yè)務(wù)辦理流程實(shí)例一:銀行業(yè)務(wù)辦理流程 在銀行辦理業(yè)務(wù)時(shí),一般都包含幾個(gè)基本步驟,首先在銀行辦理業(yè)務(wù)時(shí),一般都包含幾個(gè)基本步驟,首先需要取號(hào)排隊(duì),然后辦理具體業(yè)務(wù),最后需要對(duì)銀行需要取號(hào)排隊(duì),然后辦理具體業(yè)務(wù),最后需要對(duì)銀行工作人員進(jìn)行評(píng)分。無論具體業(yè)務(wù)是取款、存款還是工作人員進(jìn)行評(píng)分。無論具體業(yè)務(wù)是取款、存款還是轉(zhuǎn)賬,其基本流程都一樣?,F(xiàn)使用模板方法模式模擬轉(zhuǎn)賬,其基本流程都一樣?,F(xiàn)使用模板方法模式模擬銀行業(yè)務(wù)辦理流程。銀行業(yè)務(wù)辦理流程。模板方法模式w 模板方法

11、模式實(shí)例與解析實(shí)例一:銀行業(yè)務(wù)辦理流程實(shí)例一:銀行業(yè)務(wù)辦理流程 takeNumber();transact();evaluate();BankTemplateMethodabstract +takeNumber ()transact ()evaluate ()process ().: void: void: void: voidDeposit+ transact ().: voidWithdraw+ transact ().: voidTransfer+ transact ().: void模板方法模式w模板方法模式實(shí)例與解析實(shí)例二:計(jì)算存款利息實(shí)例二:計(jì)算存款利息 假設(shè)系統(tǒng)需要支持兩種存款賬

12、號(hào),即貨幣市場(chǎng)假設(shè)系統(tǒng)需要支持兩種存款賬號(hào),即貨幣市場(chǎng)(Money Market)賬號(hào)和定賬號(hào)和定期存款期存款(Certificate of Deposite)賬號(hào)。這兩種賬號(hào)的存款利息是不同的,賬號(hào)。這兩種賬號(hào)的存款利息是不同的,因此,在計(jì)算一個(gè)存戶的存款利息額時(shí),必須區(qū)分兩種不同的賬號(hào)類型。因此,在計(jì)算一個(gè)存戶的存款利息額時(shí),必須區(qū)分兩種不同的賬號(hào)類型。 這個(gè)系統(tǒng)的總行為應(yīng)當(dāng)是計(jì)算出利息,這也就決定了作為一個(gè)模板方這個(gè)系統(tǒng)的總行為應(yīng)當(dāng)是計(jì)算出利息,這也就決定了作為一個(gè)模板方法模式的頂級(jí)邏輯應(yīng)當(dāng)是利息計(jì)算。由于利息計(jì)算涉及到兩個(gè)步驟:一個(gè)法模式的頂級(jí)邏輯應(yīng)當(dāng)是利息計(jì)算。由于利息計(jì)算涉及到兩個(gè)

13、步驟:一個(gè)基本方法給出賬號(hào)種類,另一個(gè)基本方法給出利息百分比。這兩個(gè)基本方基本方法給出賬號(hào)種類,另一個(gè)基本方法給出利息百分比。這兩個(gè)基本方法構(gòu)成具體邏輯,因?yàn)橘~號(hào)的類型不同,所以具體邏輯會(huì)有所不同。法構(gòu)成具體邏輯,因?yàn)橘~號(hào)的類型不同,所以具體邏輯會(huì)有所不同。 顯然,系統(tǒng)需要一個(gè)抽象角色給出頂級(jí)行為的實(shí)現(xiàn),而將兩個(gè)作為細(xì)顯然,系統(tǒng)需要一個(gè)抽象角色給出頂級(jí)行為的實(shí)現(xiàn),而將兩個(gè)作為細(xì)節(jié)步驟的基本方法留給具體子類實(shí)現(xiàn)。由于需要考慮的賬號(hào)有兩種:一是節(jié)步驟的基本方法留給具體子類實(shí)現(xiàn)。由于需要考慮的賬號(hào)有兩種:一是貨幣市場(chǎng)賬號(hào),二是定期存款賬號(hào)。系統(tǒng)的類結(jié)構(gòu)如下圖所示。貨幣市場(chǎng)賬號(hào),二是定期存款賬號(hào)。系統(tǒng)

14、的類結(jié)構(gòu)如下圖所示。模板方法模式w 模板方法模式實(shí)例與解析 實(shí)例二:計(jì)算存款利息實(shí)例二:計(jì)算存款利息 模板方法模式w 模板方法模式實(shí)例與解析實(shí)例三:數(shù)據(jù)庫操作模板實(shí)例三:數(shù)據(jù)庫操作模板 對(duì)數(shù)據(jù)庫的操作一般包括連接、打開、使用、關(guān)閉等對(duì)數(shù)據(jù)庫的操作一般包括連接、打開、使用、關(guān)閉等步驟,在數(shù)據(jù)庫操作模板類中我們定義了步驟,在數(shù)據(jù)庫操作模板類中我們定義了connDB()、openDB()、useDB()、closeDB()四個(gè)方法分別對(duì)四個(gè)方法分別對(duì)應(yīng)這四個(gè)步驟。對(duì)于不同類型的數(shù)據(jù)庫(如應(yīng)這四個(gè)步驟。對(duì)于不同類型的數(shù)據(jù)庫(如SQL Server和和Oracle),其操作步驟都一致,只是連接),其操作

15、步驟都一致,只是連接數(shù)據(jù)庫數(shù)據(jù)庫connDB()方法有所區(qū)別,現(xiàn)使用模板方法模方法有所區(qū)別,現(xiàn)使用模板方法模式對(duì)其進(jìn)行設(shè)計(jì)。式對(duì)其進(jìn)行設(shè)計(jì)。模板方法模式w 模板方法模式實(shí)例與解析實(shí)例三:數(shù)據(jù)庫操作模板實(shí)例三:數(shù)據(jù)庫操作模板 connDB();openDB();useDB();closeDB();DBOperatorabstract +connDB ()openDB ()useDB ()closeDB ()process ().: void: void: void: void: voidSQLServerDBOperator+ connDB ().: voidOracleDBOperator+

16、connDB ().: void模板方法模式w 模式優(yōu)缺點(diǎn)模板方法模式的優(yōu)點(diǎn)模板方法模式的優(yōu)點(diǎn) 模板方法模式模板方法模式在一個(gè)類中形式化地定義算法在一個(gè)類中形式化地定義算法,而,而由它的子由它的子類實(shí)現(xiàn)細(xì)節(jié)的處理類實(shí)現(xiàn)細(xì)節(jié)的處理。 模板方法模式是一種模板方法模式是一種代碼復(fù)用的基本技術(shù)代碼復(fù)用的基本技術(shù)。模板方法模式w 模式優(yōu)缺點(diǎn)模板方法模式的缺點(diǎn)模板方法模式的缺點(diǎn) 每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類,這會(huì)每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類,這會(huì)導(dǎo)致類的導(dǎo)致類的個(gè)數(shù)增加個(gè)數(shù)增加,系統(tǒng)更加龐大,設(shè)計(jì)也更加抽象,但是更,系統(tǒng)更加龐大,設(shè)計(jì)也更加抽象,但是更加符合加符合“單一職責(zé)原則單一職責(zé)原則”,使得

17、類的內(nèi)聚性得以提高。,使得類的內(nèi)聚性得以提高。模板方法模式w 模式適用環(huán)境在以下情況下可以使用模板方法模式:在以下情況下可以使用模板方法模式: 一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類將可變的行為留給子類來實(shí)現(xiàn)來實(shí)現(xiàn)。 各子類中公共的行為應(yīng)被提取出來并集中到一個(gè)公共父類各子類中公共的行為應(yīng)被提取出來并集中到一個(gè)公共父類中以中以避免代碼重復(fù)。避免代碼重復(fù)。 對(duì)一些復(fù)雜的算法進(jìn)行分割對(duì)一些復(fù)雜的算法進(jìn)行分割,將其算法中固定不變的部分設(shè)計(jì),將其算法中固定不變的部分設(shè)計(jì)為模板方法和父類具體方法,而一些可以改變的細(xì)節(jié)由其子類為模板方法和父類具體方法,而一些

18、可以改變的細(xì)節(jié)由其子類來實(shí)現(xiàn)。來實(shí)現(xiàn)。 控制控制子類的擴(kuò)展子類的擴(kuò)展。本章小結(jié)w 在模板方法模式中,定義一個(gè)操作中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。模板方法是一種類行為型模式。w 模板方法模式包含兩個(gè)角色:在抽象類中定義一系列基本操作,這些基本操作可以是具體的,也可以是抽象的,同時(shí),在抽象類中實(shí)現(xiàn)了一個(gè)模板方法,用于定義一個(gè)算法的骨架;具體子類是抽象類的子類,用于實(shí)現(xiàn)在父類中定義的抽象基本操作以完成子類特定算法的步驟,也可以覆蓋在父類中實(shí)現(xiàn)的具體基本操作。w 在模板方法模式中,方法可以分為模板方法和基本方法,其中基本方法又可以分為抽象方法、具體方法和鉤子方法,鉤子方法根據(jù)其特點(diǎn)又分為空方法和與實(shí)現(xiàn)算法步驟的基本方法“掛鉤”的方法。本章小結(jié)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論