模板方法模式由两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。通常在抽象父类中封装了子类的算法框架,包括实现一些公共方法以及封装子类中所有方法的执行顺序。子类通过继承这个抽象类,也继承了整个算法结构,并且可以选择重写父类的方法。
在模板方法模式中,子类实现中的相同部分被上移到父类中,而将不同的部分留待子类来实现。
例子:Coffee or Tea
首先我们用代码来描述一下泡咖啡的过程:
(1) 把水煮沸(2) 用沸水冲泡咖啡(3) 把咖啡倒进杯子(4) 加糖和牛奶
1 | function Coffee() { } |
然后我们用代码描述下泡茶的过程:
(1) 把水煮沸(2) 用沸水浸泡茶叶(3) 把茶水倒进杯子(4) 加柠檬
1 | function Tea() { }; |
泡茶和泡咖啡的过程是大同小异的,我们可以抽象出它们之间的共同点,比如加调料这一步,本质都是往饮料里放东西,只是放的东西不同。
我们可以创建一个抽象父类来表示泡一杯饮料的整个过程。不论是Coffee,还是Tea,都被我们用Drinks来表示:
1 | function Drinks() { }; |
接下来创建具体的Coffee类,它会继承Drinks类,实现其方法:
1 | function Coffee() { }; |
在本例子中,模板方法是Drinks的init方法,该方法中封装了子类的算法框架,它作为一个算法的模板,指导子类以何种顺序去执行哪些方法。