第九章 模板模式

Java设计模式浅析

第一章 简单工厂模式
第二章 工厂方法模式
第三章 抽象工厂模式
第四章 单例模式
第五章 破坏单例模式
第六章 原型模式
第七章 代理模式
第八章 策略模式
第九章 模板模式



概述

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

模板模式适用于以下场景:

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

一、示例代码

抽象父类 NetworkCourse
package com.Design.TemplateMethod;

public abstract class NetworkCourse {
    protected final void createCourse() {
        // 发布预习资料
        this.postPreResource();

        // 制作课件PPT
        this.createPPT();

        // 在线直播
        this.liveVideo();

        // 提交课堂笔记
        this.postNote();

        // 提交源码
        this.postSource();

        // 布置作业,有些课程是没有作业的,有些课程是有作业的
        // 如果有作业,检查作业,如果没有作业,流程结束
        if (needHomework()) {
            checkHomework();
        }
    }

    private void postPreResource() {
        System.out.println("发布预习资料");
    }

    private void createPPT() {
        System.out.println("制作课件PPT");
    }

    private void liveVideo() {
        System.out.println("在线直播");
    }

    private void postNote() {
        System.out.println("提交源代码");
    }

    private void postSource() {
        System.out.println("提交课件和笔记");
    }

    /**
     * 钩子方法:实现流程的微调
     *
     * @return
     */
    protected boolean needHomework() {
        return false;
    }

    protected abstract void checkHomework();
}

子类 JavaCourse
package com.Design.TemplateMethod;

public class JavaCourse extends NetworkCourse {
    @Override
    //重写 checkHomework 方法
    protected void checkHomework() {
        System.out.println("检查Java的课堂作业");
    }
}



子类 BigDataCourse
package com.Design.TemplateMethod;

public class BigDataCourse extends NetworkCourse {
    private boolean needHomeworkFlag = false;

    public BigDataCourse(boolean needHomeworkFlag) {
        this.needHomeworkFlag = needHomeworkFlag;
    }

    @Override
    protected boolean needHomework() {
        //new对象时 传参给私有成员变量 private 
        //needHomework() 返回自定义的值
        //needHomeworkFlag 在create方法中判断是否执行checkHomework()
        return this.needHomeworkFlag;
    }

    @Override
    protected void checkHomework() {
        System.out.println("在create方法中检查大数据的课堂作业");
    }
}

二、测试代码

package com.Design.TemplateMethod;

public class NetworkCourseTest {
    public static void main(String[] args) {
        //创建对象  再执行 createCourse()方法
        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. 因为继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值