重学设计模式-模板方法模式

96 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天, 点击查看活动详情

模板方法 - 定义与类型

1.定义

定义了一个算法的骨架,并可以子类为一个或多个步骤提供现实

1.1 特点

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

1.2 类型 : 行为型

2.适用场景

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

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

3.缺点

1.类数目增加

2.增加了系统实现的复杂度

3.继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍

4.优点

​ 1.提高复用性

​ 2.提高扩展性

​ 3.符合开闭原则

5.模板方法-扩展

钩子方法

6.模板方法-相关设计模式

模板方法模式和工厂方法模式

模板方法模式和策略模式

策略模式改变算法流程

模板方法模式 不该变算法流程 而是交给子类去实现

7.uml 设计图 在这里插入图片描述 8.代码如下

package com.zw.design.pattern.creational.behavioral.templatemetod;

public abstract class ACourse {

    protected final void makeCourse(){

        this.makePPT();
        this.makeVideo();
        //钩子方法判断
        if (this.needWriteArticle()){
            this.writeArticle();
        }
        this.packageCourse();
    }

    final void makePPT(){
        System.out.println("编写ppt");
    }

    final void makeVideo(){
        System.out.println("编写视频");
    }

    final void writeArticle(){
        System.out.println("编写手记");
    }
    //钩子方法
    protected boolean needWriteArticle(){
        return false;
    }

    abstract  void packageCourse();
}
package com.zw.design.pattern.creational.behavioral.templatemetod;

public class IOSCourse extends ACourse{
    @Override
    void packageCourse() {
        System.out.println("提供课程的IOS 代码");
        System.out.println("提供课程的图片等");
    }
    private boolean needWriteArticle;


    public IOSCourse(boolean needWriteArticle) {
        this.needWriteArticle = needWriteArticle;
    }

    @Override
    protected boolean needWriteArticle() {
        return this.needWriteArticle;
    }
}

package com.zw.design.pattern.creational.behavioral.templatemetod;

public class SpringCourse extends ACourse{
    @Override
    void packageCourse() {
        System.out.println("提供spring源码课程代码");
    }

    @Override
    protected boolean needWriteArticle() {
        return true;
    }
}

3.测试类

package com.zw.design.pattern.creational.behavioral.templatemetod;

public class Test {
    public static void main(String[] args) {
        System.out.println("后端课程spring 课程 start");
        ACourse springCourse=new SpringCourse();
        springCourse.makeCourse();
        System.out.println("后端课程spring 课程 end");


        //1.0版本 现在IOS没有写手记 该如何去做了?
//        System.out.println("前端课程IOS 课程 start");
//        ACourse ios=new IOSCourse();
//        ios.makeCourse();
//        System.out.println("前端课程IOS 课程 end");
        //比如IOS 我现在有一个需求  IOS 分为 OS 和另外一种语言  OS 需要写手记

        System.out.println("前端课程IOS 课程 start");
        ACourse ios=new IOSCourse(true);//OS 写手记
        ios.makeCourse();
        System.out.println("前端课程IOS 课程 end");

        System.out.println("前端课程IOS 课程 start");
        ACourse ios2=new IOSCourse(false);//OS 不写手记
        ios2.makeCourse();
        System.out.println("前端课程IOS 课程 end");


    }
}

测试结果如下 在这里插入图片描述 代码如下

模板设计---源码解析

在jdk当中 AbstractList这个类当中 使用模板方法 在这里插入图片描述 还有在servlet 当中 HttpServlet 当中使用的 在这里插入图片描述 在mybatis 当中的应用 BaseExecutor 的应用 使用模板方法模式 在这里插入图片描述