模板模式

给定一个指定的流程(即模板),在这个指定流程下,又流出一定的可由用户选择的分支(即钩子)。用户在大体的流程上都必须按照模板进行,但在某个分支小点可以有自己选择的权利。

示例

准备一个规范的流程:一个抽象类

public abstract class NetWorkCourse {
	//创建一个课程的规范化流程模板
    protected final void creatCrouse(){
        //1.发布预习资料
        this.postPreResource();
        //2.制作PPT
        this.creatPpt();
        //3.授课
        this.liveVideo();
        //4.上传笔记
        this.postNote();
        //5.提交源码
        this.postCode();
        //6.布置作业-有的课程有,有的课程没有(用户选择)
        if(hasHomeWork()){
            //有作业就检查作业
            checkHomeWork();
        }
    }

    /**
     * 检查的方法不一样,故先抽象
     */
    abstract void checkHomeWork();

    /**
     * 是否有作业
     * 可被重写
     * 钩子方法:用户通过此方法可以来微调这个流程
     * @return boolean
     */
    protected boolean hasHomeWork() {
        return false;
    }

    /**
     * 不可重写的方法
     * 提交源码
     */
    final void postCode() {
        System.out.println("提交源码");
    }

    /**
     * 不可重写的方法
     * 上传笔记
     */
    final void postNote() {
        System.out.println("上传笔记");
    }

    /**
     * 不可重写的方法
     * 授课
     */
    final void liveVideo() {
        System.out.println("正式上课");
    }

    /**
     * 不可重写的方法
     * 制作PPT
     */
    final void creatPpt() {
        System.out.println("创建ppt");
    }

    /**
     * 不可重写的方法
     * 发放预习资料
     */
    final void postPreResource() {
        System.out.println("分发预习资料");
    }
}

创建参照这个流程而执行的不同的实例
Java课程默认没有作业

public class JavaCourse extends NetWorkCourse {
    @Override
    void checkHomeWork() {
        System.out.println("检查Java设计模式的作业");
    }
}

大数据课程默认有作业

public class BigDataCourse extends NetWorkCourse {
    /**
     * 是否需要课后作业的标记
     */
    private boolean hasHomeWorkFlag = false;

    /**
     * 有参构造
     * @param hasHomeWorkFlag
     */
    public BigDataCourse(boolean hasHomeWorkFlag) {
        this.hasHomeWorkFlag = hasHomeWorkFlag;
    }

    /**
     * 重写钩子方法
     * @return
     */
    @Override
    protected boolean hasHomeWork() {
        return this.hasHomeWorkFlag;
    }

    /**
     * 检查作业
     */
    @Override
    void checkHomeWork() {
        System.out.println("检查大数据的课后作业");
    }
}

测试类:

public static void main(String[] args) {
        System.out.println("----Java设计模式课程----");
        JavaCourse javaCourse = new JavaCourse();
        javaCourse.creatCrouse();

        System.out.println("----大数据课程----");
        BigDataCourse bigDataCourse = new BigDataCourse(true);
        bigDataCourse.creatCrouse();
    }

结果:
在这里插入图片描述
留出钩子方法的目的就是为了实现流程的微调,有的课程有作业,有的课程没有作业,只有有作业的课程才需要检查作业。而流程的其他步骤对应的方法都是一样的,所以均定义为final
类之间的关系
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值