java中引导页面的,设计模式之模板模式引导篇
在講模板模式原理前,我們按照慣例,先來個生活中例子。茶館需要開發(fā)一個自動的泡咖啡和泡茶的程序。
來源:凱哥Java(kaigejava)
我們先來看看泡咖啡和泡茶的步驟:
我們根據(jù)上圖寫代碼實現(xiàn):
泡咖啡類,如下圖:
泡茶類如下圖:
測試類:
運(yùn)行結(jié)果:
很簡單。也很容易寫出來。寫出來很清楚。
從上圖中,可以發(fā)現(xiàn),兩個流程幾乎是一樣的套路(步驟)。其中,不變的部分:水燒開、倒入杯子、送給客人。這三步是不變的。
變化的是:沖咖啡還是泡茶葉;加糖/牛奶還是加檸檬這兩個步驟是變化的。
項目進(jìn)化第一個版本:
我們將不變的抽取出來,放到一個公共的類中。HotDrink。然后讓coffe和tea都繼承公共的類。得到的類圖如下:
hotdrink超類代碼如下:
項目進(jìn)化第二個版本:
經(jīng)過分析,我們發(fā)現(xiàn),兩個流程的還有相同的地方:
1.兩個流程的步驟都一樣(都是五個步驟的);
2.無論泡茶還是泡咖啡都是brew操作;
3.無論加糖還是加檸檬都是添加調(diào)料的。
所以,我們對項目在進(jìn)行一次提取:
我們將操作流程也提取到超類中,將2和3操作也放到超類中。讓子類具體實現(xiàn)。所以得到類圖如下:
我們來看看這次hotdrink類里面:
public abstract classHotDrink {
public final voidprepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
send();
}
protected abstract voidaddCondiments();
protected abstract voidbrew();
private final voidboilWater() {
System.out.println("一.燒水");
}
private final voidpourInCup() {
System.out.println("三.倒入杯中");
}
我們發(fā)現(xiàn),在prepareRecipe方法和boilWter、pourInCup、send這四個操作都添加了final關(guān)鍵字來修改。這是為什么呢?
從上面分析,我們知道,都是五個步驟,而且五個步驟中的三個步驟(燒水、倒入杯中、送客人)也是固定不變的。那么,在Java中,固定不變的這個怎么表示呢?對了,就使用fianl這個關(guān)鍵字修飾就可以了。這樣,就可以放置子類不能隨便修改步驟(比如由五步變成三步),已經(jīng)規(guī)定的不能在修改了。比如燒水這個不燒了,這樣是不行的。
我們來看看,熱飲coffee和tea的類:
hotDrinkTea:
測試方法:
運(yùn)行結(jié)果:
我們對項目進(jìn)化進(jìn)行復(fù)盤總結(jié),可以得到:
所謂的模板模式:封裝了一個算法的步驟,并允許子類為一個或多個步驟方法提供實現(xiàn)。模板模式,可以使子類在不改變算法結(jié)構(gòu)(如上面的五步)的情況下,重新定義算法中某些步驟(如上面的第二步和第四步)
模板模式類圖如下:
類圖說明:
1:是一個抽象類(如:hotDrink)
2:有個模板方法。這個模板方法是final的(如:prepareRecipe方法)
3:由三種方法:
AbsOperation:抽象的方法(泡咖啡、加牛奶)
concreteOp:具體的方法(如燒水。可以是final的也可以不是)
hook:鉤子。可以選的子類可以覆蓋父類的方法。
我們來演示下帶有hook的。
比如,現(xiàn)在有了新需求,客戶可以自己選擇需不需要添加調(diào)料。這個怎么做呢?
我們從新定義模板:
tea實現(xiàn)了該模板類,并且不加檸檬的:
測試運(yùn)行:
結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的java中引导页面的,设计模式之模板模式引导篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用matlab参数法拟合,MATLAB|
- 下一篇: php定时执行任务没有执行,linux中