定義:在一個(gè)方法中定義一個(gè)算法的骨架舔腾,而將一些步驟延遲到子類中溪胶。
模板方法模式使得子類可以在不改變算法結(jié)構(gòu)的前提下,重新定義算法中的某些步驟的實(shí)現(xiàn)稳诚。
我們都知道Activity的7個(gè)生命周期方法哗脖,這個(gè)流程是死的,可是這個(gè)是怎么來(lái)的呢?
就是用的模板方法模式才避。
定義看起來(lái)非常難懂橱夭,我通俗的理解是這樣的:
對(duì)于實(shí)現(xiàn)步驟相同的事務(wù)來(lái)講,我們可以把這些步驟抽象出來(lái)桑逝,定義成一個(gè)具體的框架棘劣,或者說(shuō)是一個(gè)具體的流程。
這里我用了Head First上的例子楞遏,沖泡茶和咖啡茬暇,都需要四個(gè)步驟:
1.把水煮沸
2.沖泡(茶/咖啡)
3.倒進(jìn)杯子
4.加額外的調(diào)料(牛奶/糖)
即泡茶和沖咖啡的流程就是這個(gè)流程,不管你沖的是什么咖啡寡喝,泡的是什么茶糙俗,但是步驟是死的。
那么就可以定義一個(gè)類预鬓,將這些個(gè)步驟封裝起來(lái)巧骚,然后需要泡咖啡或者是泡茶的時(shí)候就繼承這個(gè)類就好了。
但是還有一點(diǎn)格二,步驟2和步驟4在具體實(shí)現(xiàn)的時(shí)候可能是不一樣的劈彪,制作茶的時(shí)候沖的是茶,加的可能是糖顶猜,而咖啡可能還要加牛奶沧奴。
既然已經(jīng)有了繼承關(guān)系,那么只需要將這兩個(gè)方法在子類中重寫即可驶兜,而對(duì)于步驟1和步驟3扼仲,不希望子類改變远寸,可以將其直接寫死抄淑,不讓子類重寫。
另外驰后,這個(gè)步驟是死的肆资,不能被改變的,因此也需要寫死灶芝。
可是郑原,還有一個(gè)問(wèn)題,我要是泡茶的時(shí)候不想加額外的東西夜涕,我就想第三步就可以直接喝了犯犁,這樣的話這個(gè)步驟是死的,豈不是做不到了女器。
所以酸役,為了保證靈活起見(jiàn),可以在上面的步驟中增加一些判斷,看是否需要第四步涣澡,不需要的話就不執(zhí)行贱呐,實(shí)現(xiàn)起來(lái)就是在模板中增加一個(gè)判斷,這個(gè)判斷的方法由抽象類提供默認(rèn)實(shí)現(xiàn)入桂,子類也可以擁有自己的實(shí)現(xiàn)奄薇,自己選擇是否需要執(zhí)行這個(gè)步驟,這樣一來(lái)就很靈活了抗愁。(這就是鉤子)
代碼:
首先是模板類
public abstract class Drinks {
public final void makeDriks(){
boliWater();
brew();
pourInCup();
if(needCondiments()){
addCondiments();
}
}
private void boliWater() {
System.out.println("把水煮沸...");
}
protected abstract void brew();
private void pourInCup() {
System.out.println("倒進(jìn)杯子...");
}
public boolean needCondiments(){
return true;
}
protected abstract void addCondiments();
}
然后是咖啡實(shí)現(xiàn):
public class Coffee extends Drinks {
@Override
protected void brew() {
System.out.println("沖泡咖啡...");
}
@Override
protected void addCondiments() {
System.out.println("向咖啡里加牛奶...");
}
}
然后是茶的實(shí)現(xiàn):
public class Tea extends Drinks {
@Override
protected void brew() {
System.out.println("沖泡茶...");
}
@Override
protected void addCondiments() {
System.out.println("向茶里加糖...");
}
@Override
public boolean needCondiments() {
return false;
}
}
最后測(cè)試:
public class Test {
public static void main(String[] args) {
Coffee coffee = new Coffee();
coffee.makeDriks();
System.out.println("\n");
Tea tea = new Tea();
tea.makeDriks();
}
}
簡(jiǎn)單的說(shuō)馁蒂,就是定義一個(gè)模板類,其中定義一個(gè)方法驹愚,內(nèi)部有一系列調(diào)用其他方法的邏輯远搪,其中的一些自己默認(rèn)實(shí)現(xiàn),一些提供給子類來(lái)進(jìn)行個(gè)性化實(shí)現(xiàn)逢捺。子類繼承了這個(gè)類之后谁鳍,默認(rèn)的就擁有了這一系列的處理邏輯,加上自己的實(shí)現(xiàn)劫瞳,就能夠在模板的基礎(chǔ)上構(gòu)造出一個(gè)新的事物倘潜。