網(wǎng)絡(luò)營(yíng)銷的目的seo專業(yè)培訓(xùn)學(xué)費(fèi)多少錢
模板方法模式
- 問(wèn)題背景
- 解決方案:模板方法模式
- 基本介紹
- 解決問(wèn)題
- 代碼示例
- 運(yùn)行結(jié)果
- 鉤子方法
- 注意事項(xiàng)和細(xì)節(jié)
問(wèn)題背景
豆?jié){的制作:
1)制作豆?jié){的流程:選材—>添加配料—>浸泡—>放到豆?jié){機(jī)打碎
2)通過(guò)添加不同的配料,可以制作出不同口味的豆?jié){
3)選材、浸泡和放到豆?jié){機(jī)打碎這幾個(gè)步驟對(duì)于制作每種口味的豆?jié){都是一樣的
4)請(qǐng)使用模板方法模式完成
說(shuō)明:因?yàn)槟0宸椒J?#xff0c;比較簡(jiǎn)單,很容易就想到這個(gè)方案,因此就直接使用,不再使用傳統(tǒng)的方案來(lái)引出模板方法模式
解決方案:模板方法模式
基本介紹
1)模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),在一個(gè)抽象類中公開(kāi)定義他的方法的模板。他的子類可以按需重寫(xiě)方法實(shí)現(xiàn),但調(diào)用將按照抽象類中定義的方式進(jìn)行。
2)簡(jiǎn)單說(shuō),模板方法模式定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個(gè)算法的結(jié)構(gòu),就可以重定義該算法的某些特定步驟
3)這種類型的設(shè)計(jì)模式屬于行為型模式。
解決問(wèn)題
首先我們來(lái)畫(huà)出UML類圖:
1)SoyaMikl抽象類是豆?jié){的制作類
2)select()方法是選擇黃豆,這一步所有豆?jié){都是通用的,所以在SoyaMilk抽象類就可以實(shí)現(xiàn)
3)add()方法是添加配料,因?yàn)樘砑优淞喜煌?#xff0c;制作出的豆?jié){口感不同,所以我們?cè)赟oyaMilk抽象類中實(shí)現(xiàn)一個(gè)抽象方法,交給子類去實(shí)現(xiàn)。
4)soak()方法是浸泡黃豆和配料,beat()方法是放到豆?jié){機(jī)打碎,這兩個(gè)方法都是通用的,所以也在抽象類中實(shí)現(xiàn)。
5)make()方法是對(duì)外提供的一個(gè)調(diào)用方法,make()方法調(diào)用了下面4個(gè)方法,對(duì)于調(diào)用者來(lái)說(shuō)直接調(diào)用SoyaMilk的make()方法就可以制作豆?jié){了
代碼示例
public abstract class SoyaMilk {/*** 制作豆?jié){*/public void make() {select();add();soak();beat();}/*** 挑選黃豆*/private void select() {System.out.println("挑選上好的黃豆");}/*** 添加配料*/public abstract void add();/*** 浸泡*/private void soak() {System.out.println("將黃豆和配料一起浸泡三個(gè)小時(shí)");}/*** 打碎*/private void beat() {System.out.println("放到豆?jié){機(jī)中打碎");}
}
/*** 紅豆豆?jié){*/
public class BlackBeanSoyaMilk extends SoyaMilk{@Overridepublic void add() {System.out.println("加入配料紅豆");}
}
/*** 花生豆?jié){*/
public class PennutSoyaMilk extends SoyaMilk{@Overridepublic void add() {System.out.println("加入配料花生");}
}
public class Client {public static void main(String[] args) {// 制作紅豆豆?jié){SoyaMilk blackBeanSoyaMilk = new BlackBeanSoyaMilk();blackBeanSoyaMilk.make();// 制作花生豆?jié){SoyaMilk pennutSoyaMilk = new PennutSoyaMilk();pennutSoyaMilk.make();}
}
運(yùn)行結(jié)果
鉤子方法
在模板方法模式的父類中,我們可以定義一個(gè)方法,它默認(rèn)不做任何事,子類可以視情況要不要覆蓋它,該方法稱為“鉤子”
注意事項(xiàng)和細(xì)節(jié)
1)基本思想是:算法只存在于一個(gè)地方,也就是在父類中,容易修改。需要修改算法時(shí),只要修改父類的模板方法或者已經(jīng)實(shí)現(xiàn)的某些步驟,子類就會(huì)繼承這些修改
2)實(shí)現(xiàn)了最大化代碼復(fù)用。父類的模板方法和已實(shí)現(xiàn)的某些步驟會(huì)被子類繼承而直接使用。
3)既統(tǒng)一了算法也提供了很大的靈活性。父類的模板方法確保了算法的結(jié)構(gòu)保持不變,同時(shí)由子類提供部分步驟的實(shí)現(xiàn)。
4)該模式的不足之處:每一個(gè)不同的實(shí)現(xiàn)都需要一個(gè)子類實(shí)現(xiàn),導(dǎo)致類的個(gè)數(shù)增加,使得系統(tǒng)更加龐大
5)一般模板方法都加上final關(guān)鍵字, 防止子類重寫(xiě)模板方法
6)模板方法模式使用場(chǎng)景:當(dāng)要完成在某個(gè)過(guò)程,該過(guò)程要執(zhí)行一系列步驟,這一系列的步驟基本相同,但其個(gè)別步驟在實(shí)現(xiàn)時(shí)可能不同,通??紤]用模板方法模式來(lái)處理