您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——模板方法模式

小志的博客 发布时间:2021-01-07 23:18:28 ,浏览量:0

目录
    • 一、模板方法模式的定义与类型
    • 二、模板方法模式的适用场景
    • 三、模板方法模式的优点
    • 四、模板方法模式的缺点
    • 五、模板方法模式的扩展
    • 六、模板方法模式的相关设计模式
    • 七、模板方法模式示例

一、模板方法模式的定义与类型

1、定义

  • 定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
  • 模板方法使得子类在不改变算法结构的情况下,重新定义算法的某些步骤

2、类型

  • 行为型
二、模板方法模式的适用场景
  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
  • 各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复
三、模板方法模式的优点
  • 提高复用性
  • 提高扩展性
  • 符合开闭原则
四、模板方法模式的缺点
  • 类数目增加
  • 增加了系统实现的复杂度
  • 继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍
五、模板方法模式的扩展
  • 钩子方法
六、模板方法模式的相关设计模式
  • 模板方法模式和工厂方法模式
  • 模板方法模式和策略模式
七、模板方法模式示例

通过制作课程的模板类(Course)演示模板方法模式

1、创建一个抽象的课程类接口

package com.rf.designPatterns.behavioral.templateMethod;

/**
 * @description: 创建一个抽象的课程类接口
 * @author: xz
 */
public abstract class Course {
    /**
     * 制作课程方法
     * final修饰不希望子类覆盖此方法
     */
    protected final void makeCourse(){
        this.makePPT();
        this.makeVideo();
        //调用钩子方法,返回true时调用写笔记方法
        if(needWriteNotes()){
            writeNotes();
        }
        this.packageCourse();
    }
    /**
     * 制作ppt方法
     * final修饰不希望子类覆盖此方法
     */
    final void makePPT(){
        System.out.println("制作ppt");
    }
    /**
     * 制作视频方法
     * final修饰不希望子类覆盖此方法
     */
    final void makeVideo(){
        System.out.println("制作视频");
    }
    /**
     * 写笔记方法
     * final修饰不希望子类覆盖此方法
     */
    final void writeNotes(){
        System.out.println("写笔记");
    }

    //钩子方法
    protected boolean needWriteNotes(){
        return false;
    }

    //包装课程方法,交给子类实现
    abstract void packageCourse();
}

2、创建一个java课程类

package com.rf.designPatterns.behavioral.templateMethod;

/**
 * @description: 创建一个设计模式课程类
 * @author: xz
 */
public class JavaCourse extends Course{
    //重写包装课程类
    @Override
    void packageCourse() {
        System.out.println("提供课程java源码");
    }

    //在子类中实现是否需要写笔记方法
    @Override
    protected boolean needWriteNotes() {
        return true;
    }
}

3、创建一个Vue课程类

package com.rf.designPatterns.behavioral.templateMethod;
/**
 * @description: 创建一个Vue课程类
 * @author: xz
 */
public class VueCourse extends Course{

    private boolean needWriteNotesFlag=false;

    //通过构造器注入
    public VueCourse(boolean needWriteNotesFlag) {
        this.needWriteNotesFlag = needWriteNotesFlag;
    }

    //重写包装课程类
    @Override
    void packageCourse() {
        System.out.println("提供课程vue源码");
    }

    //在应用端传参数实现是否需要写笔记
    @Override
    protected boolean needWriteNotes() {
        return this.needWriteNotesFlag;
    }
}

4、创建测试类

package com.rf.designPatterns.behavioral.templateMethod;

/**
 * @description: 创建测试类
 * @author: xz
 */
public class Test {
    public static void main(String[] args) {

        System.out.println("后端设计模式课程 start======");
        Course javaCourse= new JavaCourse ();
        javaCourse.makeCourse();
        System.out.println("后端设计模式课程 end======");
        System.out.println("");

        System.out.println("前端vue课程 start======");
        Course vueCourse = new VueCourse(false);
        vueCourse.makeCourse();
        System.out.println("前端vue课程 end======");
    }
}

5、运行结果如下: 在这里插入图片描述 6、UML类图如下: 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0479s