Skip to content

Latest commit

 

History

History
144 lines (104 loc) · 4.27 KB

08-模板模式.md

File metadata and controls

144 lines (104 loc) · 4.27 KB

模板模式

​ 模板模式通常又叫模板方法模式(Template Method Pattern)是指定义一个算法骨架,并允许子类为一个或者多个步骤提供实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤,属于行为型设计模式。模板方法适用于一下应用场景:

  1. 一次性实现一个算法不变的部分,并将可变的行为留给子类来实现。

  2. 各子类中公共的行为被提取出来 并集中到一个公共的父类中,从而避免代码重复。

    还是以课程为例:发布预习资料-->制作课件PPT-->在线直播-->提交笔记-->提交源码-->布置作业-->检查作业

    创建NetworkCourse抽象类:

package com.wenbin.design.pattern.template.course;

/**
 * 模板会有一个或者多个未现实方法,
 * 而且这几个未实现方法有固定的执行循序
 */
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类:

package com.wenbin.design.pattern.template.course;

public class JavaCourse extends NetworkCourse {
    void checkHomework() {
        System.out.println("检查Java作业");
    }
}

创建BigDataCourse类:

package com.wenbin.design.pattern.template.course;

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

测试代码:

package com.wenbin.design.pattern.template.course;

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. 继承关系自身确定,如果父类添加新的抽象方法,所有子类都要改一遍。

模板方法模式比较简单,多结合业务场景思考问题,就能把模板方法模式运用好。