源代碼
GitHub源代碼
1.本文目標(biāo)
本文目標(biāo)是為了讓大家認(rèn)識并理解模板方法模式
2.基本套路
定義:定義了一個算法的骨架,并允許子類為一個或多個步驟提供實(shí)現(xiàn)
類型:行為型
選擇關(guān)鍵點(diǎn):算法骨架是否牢固
設(shè)計(jì)原則:破壞里氏替換,體現(xiàn)功能復(fù)用
使用概率:80%
難度系數(shù):中低
3.適用場景
1.一次性實(shí)現(xiàn)一個算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn)
2.各子類中公共的行為被提取出來并集中到一個公共父類中,從而避免代碼重復(fù)
4.使用步驟
用栗子能更好的說明問題,請繼續(xù)往下看
5.舉個栗子
我們用具體的代碼去更好的理解這個設(shè)計(jì)模式
5.1栗子說明
- 背景:錄制視頻都需要編寫ppt,制作視頻和寫手記,然后用這個模板制作不同的課程
- 目的:通過模板方法去制作
5.2使用步驟
實(shí)現(xiàn)代碼如下:
步驟1.創(chuàng)建課程抽象類
public abstract class ACourse {
//模板方法 制作課程
protected final void makeCourse(){
this.makePPT();
this.makeVideo();
if(needWriteArticle()){
this.writeArticle();
}
this.packageCourse();
}
final void makePPT(){
System.out.println("制作PPT");
}
final void makeVideo(){
System.out.println("制作視頻");
}
final void writeArticle(){
System.out.println("編寫手記");
}
//鉤子方法
protected boolean needWriteArticle(){
return false;
}
//包裝課程
abstract void packageCourse();
}
步驟2.創(chuàng)建設(shè)計(jì)模式課程,繼承抽象課程類
public class DesignPatternCourse extends ACourse {
@Override
void packageCourse() {
System.out.println("提供課程Java源代碼");
}
@Override
protected boolean needWriteArticle() {
return true;
}
}
步驟3.創(chuàng)建前端課程,繼承抽象課程類
public class FECourse extends ACourse {
private boolean needWriteArticleFlag = false;
@Override
void packageCourse() {
System.out.println("提供課程的前端代碼");
System.out.println("提供課程的圖片等多媒體素材");
}
public FECourse(boolean needWriteArticleFlag) {
this.needWriteArticleFlag = needWriteArticleFlag;
}
@Override
protected boolean needWriteArticle() {
return this.needWriteArticleFlag;
}
}
步驟4. 測試
public static void main(String[] args) {
System.out.println("設(shè)計(jì)模式課程start---");
ACourse designPatternCourse = new DesignPatternCourse();
designPatternCourse.makeCourse();
System.out.println("設(shè)計(jì)模式課程end---");
System.out.println("前端課程start---");
ACourse feCourse = new FECourse(false);
feCourse.makeCourse();
System.out.println("前端課程end---");
}
6.優(yōu)點(diǎn)
- 提高復(fù)用性
- 提高擴(kuò)展性
- 符合開閉原則
7.缺點(diǎn)
- 類數(shù)目的增加
- 增加了系統(tǒng)實(shí)現(xiàn)的復(fù)雜度
- 繼承關(guān)系自身缺點(diǎn),如果父類添加新的抽象方法,所有的子類都要改一遍
8.總結(jié)
本文只是對模板方法模式進(jìn)行一個分享,接下來會從創(chuàng)建型模式,結(jié)構(gòu)型模式,行為型模式,這三大類展開一個系列分享,大家可以持續(xù)進(jìn)行關(guān)注,信仰年輕的設(shè)計(jì)模式,蟹蟹啦。