模板模式
(1)概念
模板模式通常又叫模板方法模式(Template Method Pattern)是指定义一个算法的骨
架,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结
构的情况下,重新定义算法的某些步骤,属于行为性设计模式。
(2)适用场景
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2、各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
3、通常,在微服务架构中一般会建立一个common的module,里面抽取公共的类,然后其他的module来是这个module的子module
(3)代码示例
整体的类图
我们通常上网课看视频,通常网课的步骤是发布预习资料–>制作课件 PPT–>在线直播–> 提 交 课 堂 笔 记 --> 提 交 源 码 --> 布 置 作 业 --> 检 查 作 业 。
首先建立一个抽象类NetworkCourse
- NetworkCourse 类
package com.alibaba.design.templatemethodpattern.course; /** * @author zhouyanxiang * @create 2020-07-2020/7/29-19:50 */ public abstract class NetworkCourse { public final void createCourse(){ //1、发布预习资料 this.postPreResource(); //2、制作PPT课件 this.createPPT(); //3、在线直播 this.liveVideo(); //4、提交课件、课堂笔记 this.postNote(); //5、提交源码 this.postSource(); //6、布置作业,有些课是没有作业,有些课是有作业的 //如果有作业的话,检查作业,如果没作业,完成了 if(needHomeWork()){ checkHomeWork(); } } abstract void checkHomeWork(); //钩子方法:实现流程的微调 protected boolean needHomeWork(){return false;} final void postSource(){ System.out.println("提交源代码"); } final void postNote(){ System.out.println("提交课件和笔记"); } final void liveVideo(){ System.out.println("直播授课"); } final void createPPT(){ System.out.println("创建备课PPT"); } final void postPreResource(){ System.out.println("分发预习资料"); } }
上述的钩子方法是设计可以进行流程的微调的,因为通常有些指标不是必须的,比如布置作业,有时候布置了有时候不用布置,因此可以这样来设计。
- JavaCourse类
package com.alibaba.design.templatemethodpattern.course; /** * @author zhouyanxiang * @create 2020-07-2020/7/29-19:51 */ public class JavaCourse extends NetworkCourse{ @Override void checkHomeWork() { System.out.println("检查java的作业"); } }
- PythonCourse类
package com.alibaba.design.templatemethodpattern.course; /** * @author zhouyanxiang * @create 2020-07-2020/7/29-19:52 */ public class PythonCourse extends NetworkCourse { private boolean needHomeworkFlag = false; public PythonCourse(boolean needHomeworkFlag){ this.needHomeworkFlag = needHomeworkFlag; } @Override void checkHomeWork() { System.out.println("检查Python的作业"); } @Override protected boolean needHomeWork() { return this.needHomeworkFlag; } }
- 客户端测试类
package com.alibaba.design.templatemethodpattern.test; import com.alibaba.design.templatemethodpattern.course.JavaCourse; import com.alibaba.design.templatemethodpattern.course.NetworkCourse; import com.alibaba.design.templatemethodpattern.course.PythonCourse; /** * @author zhouyanxiang * @create 2020-07-2020/7/29-19:53 */ public class NetworkCourseTest { public static void main(String[] args) { System.out.println("---Java架构师课程---"); NetworkCourse javaCourse = new JavaCourse(); javaCourse.createCourse(); System.out.println("---Python课程---"); NetworkCourse pythonCourse = new PythonCourse(true); pythonCourse.createCourse(); } }
(4)模板模式在源码中的体现
在AbstractList类中的get方法就是一个抽象的方法
在AbstractList类的继承类中的ArrayList中对get方法进行了重写
(5)模板模式的优缺点
- 优点:
1、利用模板方法将相同处理逻辑的代码放到抽象父类中,可以提高代码的复用性。
2、将不同的代码不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。
3、把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台,
符合开闭原则。 - 缺点:
1、类数目的增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加。
2、类数量的增加,间接地增加了系统实现的复杂度。
3、继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍。