题目
介绍下模板模式
答案
模板模式通常又叫模板方法模式(Template Method Pattern)是指定义一个算法骨架,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板方法适用于以下应用场景: 1. **一次性实现一个算法不变的部分,并将可变的行为留给子类来实现**。 2. **各子类中公共的行为被提取出来 并集中到一个公共的父类中,从而避免代码重复**。 下面我们看个实例:以课程作业为例,发布预习资料-->制作课件PPT-->在线直播-->提交笔记-->提交源码-->布置作业-->检查作业 创建 NetworkCourse 抽象类: ```java /** * 模板会有一个或者多个未现实方法, * 而且这几个未实现方法有固定的执行循序 */ public abstract class NetworkCourse { protected 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("发布预习资料"); } } ``` 上面代码中的钩子方法主要目的是用来干预执行流程,使得我们控制行为流程更加灵活,更能贴合实际业务需求。钩子方法的返回值一般为适合条件分支语句的返回值(如boolean、int)等。可以根据业务场景决定是否使用钩子方法。 创建JavaCourse类: ```java public class JavaCourse extends NetworkCourse { void checkHomework() { System.out.println("检查Java作业"); } } ``` 创建BigDataCourse类: ```java public class BigDataCourse extends NetworkCourse { private boolean needHomeworkFlag = false; public BigDataCourse(boolean needHomeworkFlag) { this.needHomeworkFlag = needHomeworkFlag; } @Override void checkHomework() { System.out.println("检查大数据的作业"); } @Override protected boolean needHomework() { return this.needHomeworkFlag; } } ``` 测试代码: ```java public class NetwokrCourseTest { public static void main(String[] args) { System.out.println("---Java 课程---"); NetworkCourse javaCourse = new JavaCourse(); javaCourse.createCourse(); System.out.println("---大数据课程---"); NetworkCourse bigDataCourse = new BigDataCourse(true); bigDataCourse.createCourse(); } } ``` ## 模板模式的优缺点 优点: 1. 利用模板方法将相同的处理逻辑的代码放到抽象父类中,可以提高代码复用性。 2. 将不同的代码在不同子类实现,通过对子类对父类的扩展增加新的行为,提高代码的扩展性。 3. 把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则。 缺点: 1. 类数目增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加。 2. 类熟练的增加,简介的增加了系统实现的复杂度。 3. 继承关系自身确定,如果父类添加新的抽象方法,所有子类都要改一遍。 模板方法模式比较简单,多结合业务场景思考问题,就能把模板方法模式运用好。