模板方法-定義與類型
- 定義:定義了一個(gè)算法的骨架,并允許子類為一個(gè)或多個(gè)步驟提供實(shí)現(xiàn)
模板方法使得子類可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些步驟 - 類型:行為型
UML圖

模板方法
模板方法-適用場景
- 一次性實(shí)現(xiàn)一個(gè)算法的不變的部分,并將可變的行為留給子類來實(shí)現(xiàn)
- 各子類中公共的行為被提取出來并集中到一個(gè)公共父類中,從而避免代碼重復(fù)(代碼重構(gòu)時(shí)經(jīng)常使用,鉤子方法)
模板方法-優(yōu)點(diǎn)
提高復(fù)用性
提高擴(kuò)展性
符合開閉原則
模板方法-缺點(diǎn)
類數(shù)目增加
增加了系統(tǒng)實(shí)現(xiàn)的復(fù)雜度
繼承關(guān)系自身缺點(diǎn),如果父類添加新的抽象方法,所有子類都要改一遍
模板方法-擴(kuò)展
鉤子方法
模板方法-相關(guān)設(shè)計(jì)模式
模板方法模式和工廠方法模式
模板方法模式和策略模式
Coding
//一個(gè)抽象悍馬模型類 HummerModel,然后有兩個(gè)悍馬具體型號的實(shí)現(xiàn)類。
public abstract class HummerModel {
//發(fā)動了
protected abstract void start();
//停下了
protected abstract void stop();
//喇叭發(fā)出聲音了
protected abstract void alarm();
//引擎也開始響了
protected abstract void engineBoom();
public final void run(){
this.start();
this.engineBoom();
this.alarm();
this.stop();
}
}
public class HummerH1Model extends HummerModel {
@Override
protected void start() {
System.out.println("悍馬H1發(fā)動");
}
@Override
protected void stop() {
System.out.println("悍馬H1停車");
}
@Override
protected void alarm() {
System.out.println("悍馬H1鳴笛");
}
@Override
protected void engineBoom() {
System.out.println("悍馬H1引擎發(fā)出聲響");
}
}
public class HummerH2Model extends HummerModel{
@Override
protected void start() {
System.out.println("悍馬H2發(fā)動");
}
@Override
protected void stop() {
System.out.println("悍馬H2停車");
}
@Override
protected void alarm() {
System.out.println("悍馬H2鳴笛");
}
@Override
protected void engineBoom() {
System.out.println("悍馬H2引擎發(fā)出聲響");
}
}
上面的代碼有個(gè)問題,喇叭是默認(rèn)響的,人不能控制,怎么完善呢?
注意!鉤子方法應(yīng)該是最開始設(shè)計(jì)就有的,而不是去完善、糾正錯(cuò)誤的
public abstract class HummerModel {
//是否能發(fā)動
protected boolean isAlarm() {
return false;
}
//發(fā)動了
protected abstract void start();
//停下了
protected abstract void stop();
//喇叭發(fā)出聲音了
protected abstract void alarm();
//引擎也開始響了
protected abstract void engineBoom();
public final void run(){
this.start();
this.engineBoom();
if(this.isAlarm()){
this.alarm();
}
this.stop();
}
}
public class HummerH1Model extends HummerModel {
private boolean alarmFlag = true;
public void setAlarm(boolean isAlarm){
alarmFlag = isAlarm;
}
@Override
protected boolean isAlarm(){
return this.alarmFlag;
}
@Override
protected void start() {
System.out.println("悍馬H1發(fā)動");
}
@Override
protected void stop() {
System.out.println("悍馬H1停車");
}
@Override
protected void alarm() {
System.out.println("悍馬H1鳴笛");
}
@Override
protected void engineBoom() {
System.out.println("悍馬H1引擎發(fā)出聲響");
}
}
模板方法模式在源碼中的應(yīng)用
- HttpServlet
- AbstractList
模板方法模式在DTS項(xiàng)目中的應(yīng)用
- AbstractCalculateEstCostService
參考文獻(xiàn)
https://www.cnblogs.com/weixk/archive/2020/06/09/13070163.html