思想以自己的言語喂養(yǎng)它自己,而成長起來柿汛。 — 泰戈爾
寫在前面
模板模式的定義:定義一個操作中的算法框架陪毡,而將一些步驟延遲到子類中绪杏,使得子類不改變算法的結(jié)構(gòu)即可重新定義某些算法的特定步驟油吭。
模板模式.gif
抽象模板類(AbstractClass):定義了一套算法框架击蹲。
具體模板類(ConcreteClass):抽象模板類的具體實現(xiàn)署拟。
認(rèn)識模板
下面通過一個例子來認(rèn)識模板模式:
中秋節(jié)快到了,各大食品廠又要開始做月餅了际邻,做月餅其實是有模板的芯丧,只要放入不同的餡料就可以制作出不同口味的月餅了芍阎。
1.抽象模板類
因為做月餅是有模板的世曾,所以我們要先定義模板。
/**
* 抽象模板類
*/
public abstract class AbsTemplate {
public abstract void ready();
public abstract void doing();
public abstract void end();
/**
* 該方法使用final修飾谴咸,防止算法框架被復(fù)寫
*/
public final void start() {
ready();
doing();
end();
}
}
2.具體模板類
現(xiàn)在我們通過這個模板來制作不同口味的月餅轮听,我喜歡吃豆沙和菠蘿口味的,那么就要使用同一個模板制作兩種口味的月餅岭佳,也就是要創(chuàng)建兩個模板類血巍,分別制作豆沙和玻璃口味的月餅。
/**
* 具體模板類
*/
public class DouShaTemplate extends AbsTemplate {
@Override
public void ready() {
Log.d("豆沙", "準(zhǔn)備豆沙餡料");
}
@Override
public void doing() {
Log.d("豆沙", "開始制作豆沙月餅");
}
@Override
public void end() {
Log.d("豆沙", "豆沙月餅制作完成");
}
}
/**
* 具體模板類
*/
public class BoLuoTemplate extends AbsTemplate {
@Override
public void ready() {
Log.d("菠蘿", "準(zhǔn)備菠蘿餡料");
}
@Override
public void doing() {
Log.d("菠蘿", "開始制作菠蘿月餅");
}
@Override
public void end() {
Log.d("菠蘿", "菠蘿月餅制作完成");
}
}
3.制作月餅
現(xiàn)在讓我們來制作不同口味的月餅珊随。
/**
* 客戶端
*/
public class Client {
public Client() {
// 制作豆沙口味月餅
AbsTemplate douSha = new DouShaTemplate();
douSha.start();
// 制作菠蘿口味月餅
AbsTemplate boLuo = new BoLuoTemplate();
boLuo.start();
}
}
總結(jié)
模板模式的使用場景:
- 多個子類有共有的方法述寡,并且邏輯基本相同時。
- 面對重要叶洞,復(fù)雜的算法鲫凶,可以把核心算法設(shè)計為模板方法,周邊相關(guān)細(xì)節(jié)功能則由各個子類實現(xiàn)衩辟。
- 需要通過子類來決定父類算法中的某些步驟是否執(zhí)行螟炫,實現(xiàn)了子類對父類的反向控制。
模板模式的優(yōu)點:
- 通過把不變的行為搬移到超類艺晴,去除了子類中重復(fù)的代碼昼钻。
- 子類實現(xiàn)算法的某些細(xì)節(jié),有助于算法的擴展封寞。
模板模式的缺點:
- 每個不同的實現(xiàn)都要定義一個子類然评,這會導(dǎo)致類的數(shù)量的增加,設(shè)計更加抽象狈究。