一、模式簡介
定義:定義一個操作中的算法骨架,而將算法的一些步驟延遲到子類中,使得子類可以不改變該算法結構的情況下重定義該算法的某些特定步驟。
場景:算法的整體步驟很固定,但其中個別部分易變時,可以將容易變的部分抽象出來,供子類實現(xiàn)。當多個子類存在公共的行為時,可以將其提取出來并集中到一個公共父類中以避免代碼重復。當需要控制子類的擴展時,模板方法只在特定點調用鉤子操作,這樣就只允許在這些點進行擴展。
- 角色結構:
- 抽象類(Abstract Class):負責給出一個算法的輪廓和骨架。它由一個模板方法和若干個基本方法構成。模板方法:定義了算法的骨架,按某種順序調用其包含的基本方法。抽象方法:在抽象類中申明,由具體子類實現(xiàn)。具體方法:在抽象類中已經(jīng)實現(xiàn),在具體子類中可以繼承或重寫它。鉤子方法:在抽象類中已經(jīng)實現(xiàn),包括用于判斷的邏輯方法和需要子類重寫的空方法兩種。
- 具體實現(xiàn)類(Concrete Class):實現(xiàn)抽象類中所定義的抽象方法和鉤子方法,它們是一個頂級邏輯的一個組成步驟。
二、模式實現(xiàn)
public abstract class AbstractBusinessBank { -> 抽象類
public final void action() { -> 模板方法,防止算法的輪廓和骨架被更改
number();
queue();
if (vip()) {
wait("客戶是VIP,尊享VIP等候室");
}else{
wait("客戶不是VIP,業(yè)務大廳等候");
}
business();
score();
}
protected void number() { -> 具體方法
System.out.println("相同步驟:辦理業(yè)務前取號");
}
protected void queue() { -> 具體方法
System.out.println("相同步驟:辦理業(yè)務前排隊");
}
protected abstract void business(); -> 抽象方法
protected void score() { -> 具體方法
System.out.println("相同步驟:對服務人員評分");
}
protected abstract boolean vip(); -> 鉤子方法
protected void wait(String content){ -> 具體方法
System.out.println(content);
}
}
public class ConcreteSaveBusinessBank extends AbstractBusinessBank { -> 具體實現(xiàn)類
@Override
protected void business() {
System.out.println("不同步驟:辦理業(yè)務存錢");
}
@Override
protected boolean vip() {
return true;
}
}
public class ConcreteWithdrawBusinessBank extends AbstractBusinessBank{ -> 具體實現(xiàn)類
@Override
protected void business() {
System.out.println("不同步驟:辦理業(yè)務取錢");
}
@Override
protected boolean vip() {
return false;
}
}
以客戶到銀行辦理業(yè)務為例子,必經(jīng)四大步驟:辦理前取號、辦理前排隊、辦理相關業(yè)務、辦理后評分,其中取號、排隊、評分都是固定的步驟,可以在抽象業(yè)務中實現(xiàn),相關業(yè)務則因客戶而異,可以是存錢、取錢、辦卡等等,可以延遲到具體業(yè)務中實現(xiàn)。
AbstractBusinessBank save = new ConcreteSaveBusinessBank();
save.action();
AbstractBusinessBank withdraw = new ConcreteWithdrawBusinessBank();
withdraw.action();