模板方法模式(TemplateMethod)
Posted qwertyue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板方法模式(TemplateMethod)相关的知识,希望对你有一定的参考价值。
1
定义:
官方的定义:编写一个操作算法中的框架,而将这些步骤延迟加载到子类中。本质上就是固定算法框架。
通俗的说就是,某些程序的编写,开头和结尾是一样的,但是中间步骤却不太一样,因此我们可以将开头和结尾写死固定,然后单独编写中间步骤的代码。
举个通俗的例子:
一次随堂测验,对于每个学生而言:
考试前都需要为考试准备工具和了解自己的考场座位号。
考试时候的试卷也是一样的,但是每个人的答案却是不一样的。
考试结束后等待成绩所需要的流程也是一样的。
那么我们写一个抽象类,可以将 “考前准备” 和“ 考试后流程” 以及 “试卷构造过程“ 都剥离出来形成模板方法,填写答案这个步骤则做成抽象方法。学生作为子类继承父类后,只需要重新实现 “填写答案” 这个方法即可。
2
模板方法结构
就如图,模板方法模式主要就是两种类——抽象类和具体子类
抽象类:
具体子类:
public abstract class ExamPaper { public final void ShowExam() { readyForExam(); FirstQuestion(); SecondQuestion(); ThridQuestion(); FourQuestion(); finishExam(); } public static void log (String info) { System.out.println(info); } public void readyForExam() { log ("read for exam"); } public void FirstQuestion() { log ("this answer of first is " + FirstAnswer()); } public void SecondQuestion() { log ("this answer of second is " + SecondAnswer()); } public void ThridQuestion() { log ("this answer of third is " + ThirdAnswer()); } public void FourQuestion() { log ("this answer of four is " + FourAnswer()); } public void finishExam() { log ("exam end"); } public abstract String FirstAnswer(); public abstract String SecondAnswer(); public abstract String ThirdAnswer(); public abstract String FourAnswer(); }
其次是两位同学类的具体实现,可以看到我们没必要再去编写考前准备、考试后的处理等方法,我们只需要实现 “填写答案” 这部分方法即可。
public class Xiaohong extends ExamPaper { @Override public String FirstAnswer() { return "first answer for Xiaohong"; } @Override public String SecondAnswer() { return "second answer for Xiaohong"; } @Override public String ThirdAnswer() { return "thrid answer for Xiaohong"; } @Override public String FourAnswer() { return "four answer for Xiaohong"; } }
public class Xiaoming extends ExamPaper { @Override public String FirstAnswer() { return "first answer for Xiaoming"; } @Override public String SecondAnswer() { return "second answer for Xiaoming"; } @Override public String ThirdAnswer() { return "thrid answer for Xiaoming"; } @Override public String FourAnswer() { return "four answer for Xiaoming"; } }
运行代码:
public class MiddleExam { public static void main(String[] args) { Xiaoming xm = new Xiaoming(); Xiaohong xh = new Xiaohong(); xm.ShowExam(); xh.ShowExam(); } }
结果:
4
总结:
模板方法模式的存在使得代码便于维护和易于扩展,同时也比较灵活。它将一些子类共有的、逻辑相同的方法剥离出来,作为模板方法。从而子类就只需要实现不同的部分。
就比如编写一个闯关游戏的背景代码部分,不同的关卡是不同的,但是每张背景的加载流程都是一样的吧?
那我们就可以把图片获取这一部分制作成抽象类,然后其余的加载图片、设置宽高、渲染部分方法写死,这样每次我们编写不同的场景都只需要实现图片获取这一方法即可。
假如某些场景变化了我们也可以覆盖父类的相应部分方法以适应这些变化。
从而可以让我们省去很多机械劳动——编写重复的代码。
以上是关于模板方法模式(TemplateMethod)的主要内容,如果未能解决你的问题,请参考以下文章
设计模式 - 学习笔记 - TemplateMethod 模板方法