一、模板方法模式介紹
1、定義與型別
定義:定義了一個演算法的骨架,并允許子類為一個或多個步驟提供實作
模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法的某些步驟
型別:行為型
2、適用場景
一次性實作一個演算法的不變的部分,并將可變的行為留給子類來實作
各子類中公共的行為被提取出來并集中到一個公共父類中,從而避免代碼重復
3、優點
提高復用性
提高擴展性
符合開閉原則
4、缺點
類數目增加
增加了系統實作的復雜度
繼承關系自身缺點,如果父類添加新的抽象方法,所有子類都要改一遍
5、擴展
鉤子方法
6、相關設計模式
模板方法模式和工廠方法模式
模板方法模式和策略模式
策略模式是使不同的演算法可以相互替換,并且不影回應用層客戶端的使用,可以改變演算法的流程;而模板方法模式是針對頂一個演算法的流程,將一些不太一樣的步驟交給子類去實作,不改變演算法的流程
二、代碼示例
模擬場景:制作課程,有些步驟和操作是固定的,但打包的時候每個課程都有自己的打包方式,并且課程不一定有手記
課程抽象類:
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();
}
課程實作類1:
public class DesignPatternCourse extends ACourse {
@Override
void packageCourse() {
System.out.println("提供課程Java源代碼");
}
@Override
protected boolean needWriteArticle() {
return true;
}
}
課程實作類2:
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;
}
}
測驗類:
public class Test {
public static void main(String[] args) {
System.out.println("后端設計模式課程start---");
ACourse designPatternCourse = new DesignPatternCourse();
designPatternCourse.makeCourse();
System.out.println("后端設計模式課程end---");
System.out.println("前端課程start---");
ACourse feCourse = new FECourse(false);
feCourse.makeCourse();
System.out.println("前端課程end---");
}
}
三、原始碼示例
1、JDK中的AbstractList
AbstractSet、AbstractMap同理


2、tomcat中的HttpServlet


轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/6007.html
標籤:設計模式
上一篇:軟體設計模式修煉 -- 狀態模式
下一篇:迭代器模式
