定義一個算法骨架(模板),將算法中的某一些步驟對子類開放修改,以此來區別子類。
比如説在部隊中可能在一起的有炮兵、汽車兵、步兵等,他們每天都要訓練,訓練內容射擊、跑步是每個兵種每天都要練的,但是還有其它訓練是每個兵種自己獨有的訓練,那麼他們一條的訓練內容可能如下。
08:00 跑步
10:00 專業訓練A
14:00 專業訓練B
16:00 射擊訓練
以上就是部隊統一制定的訓練框架,那麼炮兵的訓練可能是
08:00 跑步
10:00 裝彈訓練A
14:00 防空訓練B
16:00 射擊訓練
模板方法模式可能有以下角色
- 抽象類:定義統一的方法內容,定義抽象方法用於子類特殊實現,將這些方法組合成一個算法模板(同時裏面可能會有一些鈎子方法,這些鈎子方法實現為空,意思是可以讓子類重寫進行實現,不重寫也可以,這個步驟的有無根據自己需要)。
- 具體實現類:繼承實現抽象類及抽象方法
下面使用一個炒菜的例子來實現模板方法模式
抽象類 - Cook
public abstract class Cook {
final void template(){
putOil();
putMeat();
putVegetable();
putSalt();
putAginomoto();
plateLoading();
}
final void putOil(){
System.out.println("放油");
}
abstract void putMeat();
abstract void putVegetable();
final void putSalt(){
System.out.println("放鹽");
};
//放味精 - 根據自己喜好
void putAginomoto(){
}
final void plateLoading(){
System.out.println("裝盤");
}
}
具體實現 - 炒韭菜、炒芹菜
public class CookLeek extends Cook{
@Override
void putMeat() {
System.out.println("放入牛肉");
}
@Override
void putVegetable() {
System.out.println("放入韭菜");
}
}
public class CookCelery extends Cook{
@Override
void putMeat() {
System.out.println("放入豬肉");
}
@Override
void putVegetable() {
System.out.println("放入芹菜");
}
@Override
void putAginomoto() {
System.out.println("放入味精");
}
}
測試
public class TemplateTest {
@Test
public void test(){
Cook cook1 = new CookCelery();
cook1.template();
System.out.println("===================");
Cook cook2 = new CookLeek();
cook2.template();
}
}
======測試======
放油
放入豬肉
放入芹菜
放鹽
放入味精
裝盤
===================
放油
放入牛肉
放入韭菜
放鹽
裝盤