模板方法模式是一個相當簡單的模式.
可能1個完全不懂設計模式的程序猿在不知不覺間也多次使用了它.
我們先看看定義.
一.模板模式(TemplateMethod) 的定義.
所謂模板方法模式, 就是定義1個操作中的算法的骨架, 而將一些步驟延遲到子類中. 模板方法使得子類可以不改變1個算法的結構即可重定義該算法的某些特定步驟.
看了這麼多設計模式的定義, 這次終於是寫的比較通俗易懂了.
簡單來講,
模板方法模式把1個算法分成若干個步驟, 但是把這些步驟方法設爲抽象方法, 讓它們在子類中重寫.
這就有1個前提, 這個算法必須能嚴格分割成若干個步驟哦.
二. 洗衣機洗衣服的例子.
我們還是舉個例子來講.
洗衣機類 WashingMachine:
洗衣機最重要的方法就是洗衣服了(washing).
這個過程可以分成三個步驟
1. 進水 (inflow)
2. 清洗 (cleanning)
3. 脫水 (drying)
各種不同的洗衣機可能有不同的進水方法, 清洗方法 以及 脫水方法.
但是基本上都是可以分成上述三個步驟的.
所以我們可以把代碼寫成這樣.
public abstract class WashingMachine {
public abstract void inflow();
public abstract void cleaning();
public abstract void drying();
public void washing(){
this.inflow();
this.cleaning();
this.drying();
}
}
上面的代碼把三個子步驟寫成抽象方法,
而最終的washing()是非抽象方法.
兩個洗衣機子類: Siemens 和 Panasonic
兩個洗衣機的子類重寫了抽象類的三個抽象方法:
但是不重寫綜合算法.
public class Siemens extends WashingMachine {
@Override
public void inflow() {
// TODO Auto-generated method stub
System.out.println("SIEMENS inflow.");
}
@Override
public void cleaning() {
// TODO Auto-generated method stub
System.out.println("SIEMENS cleaning.");
}
@Override
public void drying() {
// TODO Auto-generated method stub
System.out.println("SIEMENS cleaning.");
}
}
public class Panasonic extends WashingMachine {
@Override
public void inflow() {
// TODO Auto-generated method stub
System.out.println("Panasonic inflow.");
}
@Override
public void cleaning() {
// TODO Auto-generated method stub
System.out.println("Panasonic cleaning.");
}
@Override
public void drying() {
// TODO Auto-generated method stub
System.out.println("Panasonic cleaning.");
}
}
客戶端代碼:
WashingMachine wm = new Siemens();
wm.washing();
wm = new Panasonic();
wm.washing();
輸出:
SIEMENS inflow.
SIEMENS cleaning.
SIEMENS cleaning.
Panasonic inflow.
Panasonic cleaning.
Panasonic cleaning.
可以看出, 上面連個子類, 雖然它們的步驟是完全不同的, 但是它們洗衣服方法的骨架是一樣的.
UML:
三,小結
這個模式好易明, 無非就是把1個複雜算法拆解, 然後讓不同的子類自己去實現各個步驟.
它只適用於能分解步驟的算法.
子類一般只重寫步驟方法, 不重寫綜合骨架,
一旦子類重寫了骨架, 那麼它就不是模板方法(TemplateMethod)模式了.