模板方法模式的主要設計思想是定義乙個演算法框架,允許用子類重寫或者其它方式對演算法框架內的某個步驟的具體實現進行修改。
本章內容已沖泡咖啡和茶作為例子講解,咖啡和茶葉作為飲料的一種有共通之處,首先燒水、然後沖泡咖啡或茶葉,最後將沖泡後的咖啡或茶葉水倒進杯子中。
我們可以將燒水行為和將飲料倒進杯子行為抽象出來,但是沖泡咖啡還是茶葉的話就必須要具體的去處理。
抽象父類drink,其中boilwater和pourincup是抽象出來的父類方法,由子類繼承,brew沖泡方法則根據沖泡咖啡還是茶葉具體由子類去決定。
drink中的preparerecipe是演算法主幹方法,它決定了準備飲料步驟的演算法邏輯,第一步燒水、第二步沖泡、第三步將飲料倒進杯子。
在drink中同時也實現了乙個鉤子方法hook,該鉤子方法能夠影響到演算法主幹方法,子類方法通過重寫該鉤子方法來改變演算法主幹方法。
public abstract class drink
}//燒水
public void boilwater()
//沖泡
public abstract void brew();
//將飲料倒進杯子裡
public void pourincup()
//鉤子方法
public boolean hook()
}
茶葉類重寫飲料父類drink的brew方法,實現沖泡茶葉的邏輯,並且重寫hook方法,改變了父類的演算法主幹,沖泡完茶葉後並不將茶水倒入杯子中。
public class tea extends drink
//重寫父類drink的鉤子方法,改變父類演算法主幹邏輯
@override
public boolean hook()
}
咖啡類繼承飲料父類drink,重寫brew方法實現沖泡咖啡的具體邏輯
public class coffee extends drink
}
分別例項化茶葉和咖啡,分別準備兩種飲料
public class test
}
可以看到沖泡茶葉後並沒有倒進杯子中,而咖啡沖泡後會倒入杯子中,說明鉤子方法生效了,改變了主幹演算法邏輯。
jdk原始碼中比較器其實也是一種模板方法模式,它的設計思想是定義乙個演算法主幹,然後通過傳入比較器或者實現實體的比較方法來對演算法主幹的某個步驟進行具體實現。
二十三種設計模式之模板設計模式
按照我的理解來說,就是乙個流程中,總體的步驟是固定的,但有些步驟是改變的,例如我們做煎蛋這個過程,有哪些步驟是固定的呢,打蛋,下鍋,上碟都是固定的,但有時候我們想吃鹹的,有時候想吃甜的,所以在說放佐料的步驟是改變的。所有的設計模式都是把變化點和固定點分離開來,所謂的固定和變化是相對的,例如我們有乙個...
設計模式之模板方法模式(二十三)
slf4j public abstract class drink 燒開水 public void firewater public void brewing 新增原料 例如 咖啡,牛奶等 abstract void addmaterials abstract void addother 沖泡蜂蜜綠...
設計模式 二十三 模板方法模式
template method pattern 模板方法模式 template method pattern 定義乙個操作中演算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。模板方法模式是一種基於繼承的 復用技術,它是一種類行為型...