模板方法指的是,定义一个操作中的算法骨架,将一些操作步骤延伸到子类中。模板方法就是将在不改变算法骨架的前提下而修改子类方法达到修改算法骨架
比如在塑料板上写字后挖空,在使用毛笔或者色笔填空挖空部分。
模式中的角色
抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
举个例子,以准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别。
抽象类
AbstractClass
- public abstract class AbstractPerson{
-
- public void prepareGotoSchool(){
- dressUp();
- eatBreakfast();
- takeThings();
- }
-
- protected abstract void dressUp();
- protected abstract void eatBreakfast();
- protected abstract void takeThings();
- }
具体类
ConcreteClass
- public class Student extends AbstractPerson{
- @Override
- protected void dressUp() {
- System.out.println(“穿校服");
- }
- @Override
- protected void eatBreakfast() {
- System.out.println(“吃妈妈做好的早饭");
- }
-
- @Override
- protected void takeThings() {
- System.out.println(“背书包,带上家庭作业和红领巾");
- }
- }
- public class Teacher extends AbstractPerson{
- @Override
- protected void dressUp() {
- System.out.println(“穿工作服");
- }
- @Override
- protected void eatBreakfast() {
- System.out.println(“做早饭,照顾孩子吃早饭");
- }
-
- @Override
- protected void takeThings() {
- System.out.println(“带上昨晚准备的考卷");
- }
- }
- public class Client {
- public static void main(String[] args) {
- Student student = new Student()
- student.prepareGotoSchool();
-
- Teacher teacher = new Teacher()
- teacher.prepareGotoSchool();
- }
- }
优点
模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
子类实现算法的某些细节,有助于算法的扩展。
通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。