設計模式 - 模版方法
場景小張的團隊最近接受乙個需求,實現實現一家咖啡店的沖泡咖啡和茶的沖泡自動化。之前這家咖啡店都是由咖啡師傅手動進行調製咖啡和茶。現在咖啡店需要引入自動化的點單和調製飲料的系統,小張負責實現調製飲料的功能。
咖啡師傅手工沖泡咖啡和茶的流程:
沖泡咖啡:
把水煮沸
用沸水沖泡咖啡
把咖啡倒入杯子
加糖和牛奶
沖泡茶:
把水煮沸
用沸水沖泡茶葉
把茶倒入杯子
加檸檬小張先簡單的想了一下, 如果直接實現程式,那麼新建調製咖啡和調製茶的物件,在每個物件裡面實現上述步驟。這樣想了之後小張本想直接實現,但是由於信心不足,找老王幫他code review一下思路。 老王說,小張啊,你這實現也可以,不過不夠優雅啊,你在仔細看一下上述步驟,有沒有發現重複或者共性。
小張聽了老王的話,覺得自己的設計應該太粗暴了,按照老王的引導,小張仔細看了上述步驟,發現上述步驟,1和4 是很相像的。4(加糖和牛奶/加檸檬)步驟相當於增加調料本質是相同的。那麼他應該封裝一下沖泡咖啡/茶的步驟演算法。
找出共性進行封裝,減少重複**,使系統達到維護和擴充套件成本很低的狀態。
老王誇獎到,很不錯嘛,小張你已經慢慢的了解了物件導向(oop)及使用設計模式的原因。你可以了解一下模版方法。
模版方法
模版方法實現沖泡咖啡
小張去了解了一下模版方法。針對上述沖泡步驟進行了思考。
應該有乙個抽象的物件來描述沖泡飲料這一行為,並且抽象的類實現了具體沖泡物件的共性步驟也就是1.把水煮沸和3.把飲料倒入杯子。有兩個具體的子類來具體實現沖泡茶和咖啡。
並且有些客戶不需要加調料,那麼需要對最後一步進行判斷,是否新增調料。
我們來看一下小張的類圖:
模版方法:在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模版方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中某些步驟。
**實現
沖泡飲料的抽象類
package xuelongjiang.designpartten.templatemethod;
/***
}可以看到我們在沖泡咖啡/茶的抽象類中有乙個hook方法,這個方法就是鉤子方法。預設返回true,如果沖泡咖啡預設是加調料的那麼子類就不用重寫hook方法。
咖啡類package xuelongjiang.designpartten.templatemethod;
測試類package xuelongjiang.designpartten.templatemethod;
/**模版方法和策略模式的對比
模版方法:控制演算法內部。
策略模式:不同演算法的管理。
還記得我們在策略模式中**示例嗎? 拳頭,木棍,手槍是實現介面的具體的演算法,而不介面的演算法內部。
兩個模式很相像,但是解決的問題是不同。
要點好萊塢原則:別呼叫(打**給)我們,我們會呼叫(打**給)你。(即高層元件對低層元件的方式是:別呼叫我們,我們會呼叫你們)。
模版方法設計模式
首先看乙個不使用模版方法設計模式的幾個類 可以將student類和worker類中的day 方法內的 看作是演算法,可以發現,student類和worker類的演算法相同,不同的只是演算法的每乙個步驟的具體實現細節。兩個類中的演算法相同,每個類也都要寫一遍,冗餘,而且修改演算法步驟也不方便 publ...
模版方法設計模式
模版方法設計模式 在定義功能時功能的一部分是確定的,但是有一部分是不確定的,而確定的部分在使用不確定的部分 那麼這時就將不確定的部分暴露出去,由該類的子類去完成。如下面求程式執行時間的例子 父類1 abstract class gettime 8abstract void coderun 不確定的 ...
設計模式 模版方法模式
模版方法模式說明 定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中。模版方法使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。模版方法模式就是提供了乙個很好的 復用平台,是通過把不變行為搬移到超類,去除子類的重複 來體現它的優勢。下面直接看此模式的簡單模版 抽象模版,定義並實...