Abstract
template method pattern是我学到第二个pattern,算是一个很容易理解的pattern,但却非常的实用。
Intent
对於operation,只先定义好演算法的轮廓,某些步骤则留给子类别去填补,以便在不改变演算法整体架构的情况下让子类别去精链某些步骤。
其UML表示法
在实务上,我们可能本来有一个功能完整的class,但因为『需求改变』,新的class和原来的class几乎60%相同, 只有40%不一样,因此我们希望将60%相同部份的程式留下来,仅改写40%不同的地方。
如本来某公司只生产『自动泡茶机』,後来为了增加产品线,想生产『自动泡咖啡机』,经过分析,两台机器的架构相似,生产流程也相似。
自动泡茶机
step1 : 将开水煮开
step2 : 将<茶叶>放入开水
step3 : 将<茶>倒入杯子
step4 : 加上<柠檬>
自动泡咖啡机
step1 : 将开水煮开
step2 : 将<咖啡粉>放入开水
step3 : 将<咖啡>倒入杯子
step4 : 加上<糖>和<奶精>
很明显的step1相同,但step2 ~ step4不相同,所以只需改写step2 ~ step4,step1可以继续使用。先设计一个DrinkMachine雏型,定义了生产过程和step1,因为step2 ~ step4各有差异,就留在继承DrinkMachine的class去改写,这就是template method pattern。
我们看看这个架构,日後若有新drink加入,DrinkMachine,TeaMachine,CoffeeMachine皆不用修改,符合OCP的closed for modification原则,若要加入新的class,只计程并改写DrinkMachine即可,符合OCP的open for extension原则,所以是非常好维护的架构。
简言之,template method pattern就是将不同的member function用class包起来,由derived class去改写。