專業(yè)網(wǎng)站開發(fā)服務(wù)線上推廣宣傳方式有哪些
模式定義
定義一個(gè)操作中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個(gè)算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟
- 類行為型模式
模式結(jié)構(gòu)
- AbstractClass:抽象類
- ConcreteClass:具體子類
只有類之間的繼承關(guān)系,沒有對(duì)象關(guān)聯(lián)關(guān)系
- 體現(xiàn)繼承優(yōu)勢(shì)的模式之一
好萊塢原則(Hollywood Principle)
- Don‘t call us, we’ll call you.
- 子類不顯式調(diào)用父類的方法,而是通過override父類的方法來實(shí)現(xiàn)某些具體的業(yè)務(wù)邏輯,父類控制對(duì)子類的調(diào)用
通過在子類中實(shí)現(xiàn)的鉤子方法override父類鉤子方法,對(duì)父類方法的執(zhí)行進(jìn)行約束,實(shí)現(xiàn)子類對(duì)父類行為的反向控制
- 基本方法(Primitive Method):實(shí)現(xiàn)具體邏輯步驟的方法
- 抽象方法(Abstract Method)
- 具體方法(Concrete Method)
- 鉤子方法(Hook Method):“掛鉤”方法和空方法
......public void template() {open();display();if(isPrint()) {print();} }// Hook Method public boolean isPrint() {return true; }......
- 鉤子方法的引入使得子類可以控制父類的行為
- 最簡單的鉤子方法就是空方法,也可以在鉤子方法中定義一個(gè)默認(rèn)的實(shí)現(xiàn),如果子類不覆蓋鉤子方法,則執(zhí)行父類的默認(rèn)實(shí)現(xiàn)代碼
- 比較復(fù)雜一點(diǎn)的鉤子方法可以對(duì)其他方法進(jìn)行約束
- 這種鉤子方法通常返回一個(gè)boolean類型,即返回true或false,用來判斷是否執(zhí)行某一個(gè)基本方法
- 模板方法(Template Method):匯總基本方法的方法
抽象類代碼
public abstract class AbstractClass {// 模板方法public void templateMethod() {primitiveOperation1();primitiveOperation2();primitiveOperation3();}// 基本方法—具體方法public void primitiveOperation1() {// do something}// 基本方法—抽象方法public abstract void primitiveOperation2();// 基本方法—鉤子方法public void primitiveOperation3() {// do something}}
具體子類代碼
public class ConcreteClass extends AbstractClass {public void primitiveOperation2() {// do something}public void primitiveOperation3() {// do something}}
實(shí)例
實(shí)例一:銀行業(yè)務(wù)辦理流程
在銀行辦理業(yè)務(wù)時(shí),一般都包含幾個(gè)基本步驟,首先需要取號(hào)排隊(duì),然后辦理具體業(yè)務(wù),最后需要對(duì)銀行工作人員進(jìn)行評(píng)分。無論具體業(yè)務(wù)是取款、存款還是轉(zhuǎn)賬,其基本流程都一樣。用模板方法模式模擬銀行業(yè)務(wù)辦理流程。
實(shí)例二:數(shù)據(jù)庫操作模板
對(duì)數(shù)據(jù)庫的操作一般包括連接、打開、使用、關(guān)閉等步驟,在數(shù)據(jù)庫操作模板類中我們定義了connDB()、openDB()、useDB()、closeDB()四個(gè)方法分別對(duì)應(yīng)這四個(gè)步驟。對(duì)于不同類型的數(shù)據(jù)庫(如SQL Server和Oracle),其操作步驟都一致,只是連接數(shù)據(jù)庫connDB()方法有所區(qū)別,使用模板方法模式對(duì)其進(jìn)行設(shè)計(jì)。
模式分析
- 優(yōu)點(diǎn)
- 模板方法模式在一個(gè)類中抽象地定義算法,而由它的子類實(shí)現(xiàn)
細(xì)節(jié)的處理 - 模板方法模式是一種代碼復(fù)用的基本技術(shù)
- 模板方法模式導(dǎo)致一種反向的控制結(jié)構(gòu)(Hook Method),通過一個(gè)父類調(diào)用其
子類的操作,通過對(duì)子類的擴(kuò)展增加新的行為- 符合開閉原則
- 模板方法模式在一個(gè)類中抽象地定義算法,而由它的子類實(shí)現(xiàn)
- 缺點(diǎn)
- 每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類,這會(huì)導(dǎo)致類的個(gè)數(shù)增加,系統(tǒng)更加龐大,設(shè)計(jì)也更加抽象
- 但是更加符合“單一職責(zé)原則”,使得類的內(nèi)聚性得以提高
- 每個(gè)不同的實(shí)現(xiàn)都需要定義一個(gè)子類,這會(huì)導(dǎo)致類的個(gè)數(shù)增加,系統(tǒng)更加龐大,設(shè)計(jì)也更加抽象
適用環(huán)境
- 一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn)
- 各子類中公共的行為被提取出來并集中到一個(gè)公共父類中以避免代碼重復(fù)
- 對(duì)一些復(fù)雜的算法進(jìn)行分割,將其算法中固定不變的部分設(shè)計(jì)為模板方法和父類具體方法,而一些可以改變的細(xì)節(jié)由其子類來實(shí)現(xiàn)
- 控制子類的擴(kuò)展