模板方法模式(Template)是行為模式之一,其就是簡單定義一個算法執行骨架,而將其具體的算法延遲到子類中實現,從而使出現過多的類的時候不用再改變算法和結構直接添加一個實現子類就可以了。
一般在具體統一的操作步驟和業務功能,但是具有不同的細節處理,這樣用模板方法模式減少了代碼的復用。
下面簡單的看看模板方法模式的原理圖:

實例對象對于抽象類的繼承,展開了具體的細節功能的處理,下面把模式應用到具體的實例:
簡單的對于我們每天吃飯的情況(我旁邊的各種情況),用一個普通的人作為吃飯的抽象類,然后定義吃早飯午飯晚飯都吃什么,通過不同的人對吃飯的要求也不一樣對了一個小例子:

XHW分別是三種人,然后都有固定的一日三餐,但是吃的方式是不一樣的:
~~~
package com.designpattern.template;
public abstract class Person {
public void eat() {
breakfast();
lunch();
dinner();
}
public abstract void breakfast();
public abstract void lunch();
public abstract void dinner();
}
~~~
這里定義抽象類就是用來繼承的,同時里面的eat是非抽象方法,這樣子類可以不繼承,直接實現父類指針指向子類,同時調用方法,但是對于早上中午晚上的方法,只必須要子類去繼承的,所以就抽象了一下:
~~~
package com.designpattern.template;
public class X extends Person {
@Override
public void breakfast() {
System.out.println("早晨先吃兩個麥面包片再喝一袋奶吃一個雞蛋");
}
@Override
public void dinner() {
System.out.println("中午去食堂三樓吃牛肉罩餅");
}
@Override
public void lunch() {
System.out.println("晚上去食堂一樓吃餃子在來一碗蓋飯");
}
}
~~~
~~~
package com.designpattern.template;
public class W extends Person {
@Override
public void breakfast() {
System.out.println("早晨沒有時間吃早飯,于是就不吃了");
}
@Override
public void dinner() {
System.out.println("中午去食堂二樓吃兩個饅頭一個菜一碗粥");
}
@Override
public void lunch() {
System.out.println("晚上去食堂三樓吃一個餅一盤菜一碗粥");
}
}
~~~
~~~
package com.designpattern.template;
public class W extends Person {
@Override
public void breakfast() {
System.out.println("早晨沒有時間吃早飯,于是就不吃了");
}
@Override
public void dinner() {
System.out.println("中午去食堂二樓吃兩個饅頭一個菜一碗粥");
}
@Override
public void lunch() {
System.out.println("晚上去食堂三樓吃一個餅一盤菜一碗粥");
}
}
~~~
然后在Client端調用:
~~~
package com.designpattern.template;
public class Client {
public static void main(String[] args) {
System.out.println("H");
Person h = new H();
h.eat();
System.out.println();
System.out.println("W");
Person w = new W();
w.eat();
System.out.println();
System.out.println("X");
Person x = new X();
x.eat();
System.out.println();
}
}
~~~
輸入內容如下
~~~
H
早晨一般不吃飯,減肥
晚上去尚飲吃云吞什錦
中午在外面買一點煎餅什么的吃點
W
早晨沒有時間吃早飯,于是就不吃了
晚上去食堂三樓吃一個餅一盤菜一碗粥
中午去食堂二樓吃兩個饅頭一個菜一碗粥
X
早晨先吃兩個麥面包片再喝一袋奶吃一個雞蛋
晚上去食堂一樓吃餃子在來一碗蓋飯
中午去食堂三樓吃牛肉罩餅
~~~
這樣就簡單的實現了一個模板模式;
使用模板方法模式,在定義算法的骨架的同時,可以很靈活地實現具體的算法,滿足用戶靈活多變的需求。
雖然使用模板方法模式可以很自由滴實現具體的算法,但是如果算法的骨架有改變的話,則需要重新修改抽象類。
- 前言
- 前言(目錄、源碼、資料)
- (一)簡單工廠模式(SimpleFatory)
- (二)工廠方法模式(FactoryMethod)
- (三)抽象工廠模式(AbstractFactory)
- (四)創建者模式(Builder)
- (五)原型模式(Prototype)
- (六)單例模式(Singleton)
- (七)外觀模式(Facade)
- (八)適配器模式(Adapter)
- (九)代理模式(Proxy)
- (十)裝飾模式(Decorator)
- (十一)橋模式(birdge)
- (十二)組合模式(Composite)
- (十三)享元模式(Flyweight)
- (十四)模板方法模式(Template)
- (十五)觀察者模式(Observer)
- (十六)狀態模式(State)