设计模式学习(七)模板模式

定义

模板模式通常又叫做模板方法模式Template Method Pattern)是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。

模板方法使得子类可以再不改变算法结构的情况下,重新定义算法的某些步骤。

属于行为型设计模式。

适用场景

  1. 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;
  2. 各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。

UML类图

在这里插入图片描述

代码实现

模板模式会有一个或者多个未实现的方法,而且这几个未实现的方法有固定的执行顺序

NetworkCourse

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();

    /**
     * 是否有作业,默认没有作业
     * @return
     */
    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

public class JavaCourse extends NetworkCourse {

    @Override
    void checkHomeWork() {
        System.out.println("检查Java的架构课件");
    }
}

BigDataCourse

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;
    }
}

测试类

public class NetworkCourseTest {

    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();
    }
}

输出结果

--Java架构师课程--
发布预习资料
创建备课PPT
直播授课
提交课件、笔记
提交源代码
--大数据课程--
发布预习资料
创建备课PPT
直播授课
提交课件、笔记
提交源代码
检查大数据的课后作业

模板模式的优点

  1. 提高代码的复用性;
  2. 提高代码的扩展性;
  3. 符合开闭原则。

模板模式的缺点

  1. 类数目的增加;
  2. 间接地增加了系统实现的复杂度;
  3. 继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
发布了62 篇原创文章 · 获赞 48 · 访问量 7万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章