源碼地址 | https://github.com/DingMouRen/DesignPattern |
---|
- AbsTemplate抽象類,定義一套算法框架
- ComcreteImplA ComcreteImplB 具體實現(xiàn)類
定義
模板方法模式定義一個操作中的算法框架主慰,將一些步驟延遲到子類中属桦,使得子類可以不改變一個算法結(jié)構(gòu)蝗砾,子類可以重寫算法中某些特定步驟。
使用場景
- 多個子類有公有的方法文兑,并且邏輯基本相同時
- 復(fù)雜的算飯丰滑,將核心算法設(shè)計為模板方法顾犹,周邊的相關(guān)細節(jié)功能由各個子類實現(xiàn)
- 重構(gòu)時,經(jīng)常使用模板方法模式,將相同的代碼抽取到父類中炫刷,然后通過鉤子約束其行為
舉個栗子
我們都會登錄計算機擎宝,登錄計算機基本都是相同的步驟。但是不同的計算機柬唯,可能啟動時開啟的具體軟件是不同的认臊,
//Template模板類
public abstract class AbstractComputer {
//啟動計算機固定步驟:開啟電源、硬件檢查锄奢、加載系統(tǒng)、用戶登錄剧腻,用final休息拘央,不讓子類修改
public final void startUp(){
powerOn();
checkHardware();
loadOS();
login();
hook();//鉤子
System.out.println("登錄后。书在。灰伟。。儒旬。栏账。,然后就關(guān)機了");
}
private void powerOn() {
System.out.println("開啟電源");
}
//檢查硬件
protected abstract void checkHardware();
//加載系統(tǒng)
protected abstract void loadOS();
//用戶登錄
protected abstract void login();
/**
* 鉤子:默認不做事的方法栈源,子類根據(jù)情況決定要不要覆蓋挡爵。
* 例子:假如算法模板中有一個方法需要在一個條件允許下才能執(zhí)行,這里hook()返回boolean值甚垦,這里hook()方法的實現(xiàn)就是去檢驗
* 條件是否允許
*/
protected void hook(){
}
}
//子類來實現(xiàn)算法中的某些步驟
public class CoderComputer extends AbstractComputer {
@Override
protected void checkHardware() {
System.out.println(getClass().getSimpleName()+"檢查硬件");
}
@Override
protected void loadOS() {
System.out.println(getClass().getSimpleName()+"加載linux系統(tǒng)");
}
@Override
protected void login() {
System.out.println(getClass().getSimpleName()+"進行用戶和密碼驗證");
}
}
使用
public static void main(String[] args) {
AbstractComputer computer = new CoderComputer();
computer.startUp();
computer = new MilitaryComputer();
computer.startUp();
}
總結(jié)
優(yōu)點:
- 封裝不變部分茶鹃,擴展可變部分
- 提取公共部分代碼,便于維護
缺點:會增加閱讀代碼的難度