设计模式课程 设计模式精讲 17-2 模板方法模式coding
1 代码演练
1.1 代码演练1
1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法)
1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?)
1 代码演练
1.1 代码演练1
目的:
木木网制作课程视频父类,前端课程子类和设计模式子类。父类需要制作PPT,制作视频,制作手记,包装课程四个部分,且步骤基本一致,其中制作PPT和制作视频都一致,前端子类和后端子类包装课程方法不一样。
uml类图:

测试类:
package com.geely.design.pattern.behavioral.templatemethod;
public class Test {
public static void main(String [] args){
System.out.println("=======================后端课程开始");
ACourse aCourse1 = new DesignPatternCourse();
aCourse1.makeCourse();
System.out.println("=======================后端课程结束");
System.out.println("=======================前端课程开始");
ACourse aCourse2 = new FECourse();
aCourse2.makeCourse();
System.out.println("=======================前端课程结束");
}
}
抽象课程父类:
package com.geely.design.pattern.behavioral.templatemethod; /**
* 制作抽象类 课程类,用于被其他类继承
*/
public abstract class ACourse { /**
* 整合课程 的方法,
* 该流程是固定的,子类不能重写
*/
protected final void makeCourse(){
makePPT();
makeVideo();
if(needMakeArticle()){
makeArticle();
}
packageCourse();
}
/**
* 制作PPT 方法
* 目的:如果想要每个子类都不能重写该方法,就用final修饰
* 原因:每个子类都必须有制作PPT的方法
*/
final void makePPT(){
System.out.println("开始制作PPT");
} /**
* 同上
*/
final void makeVideo(){
System.out.println("制作课程视频");
} /**
* 制作手记方法
* 该方法不可被重写
* 有的课程需要制作,有的课程不需要
*/
final void makeArticle(){
System.out.println("编写手记");
} /**
* 添加钩子方法
* 该方法可被子类重写,用于判断子类是否需要制作手记
* @return
*/
protected boolean needMakeArticle(){
return false;
} /**
* 包装课程方法,
* 目的:不同的课程,包装的素材也不一样,所以声明抽象的,子类可以重写
*/
abstract void packageCourse();
}
前端子类:
package com.geely.design.pattern.behavioral.templatemethod;
public class FECourse extends ACourse{
/**
* 不同子类实现不同包装方法
*/
@Override
void packageCourse() {
System.out.println("提供课程前端代码");
System.out.println("提供课程图片素材");
}
}
后端子类:
package com.geely.design.pattern.behavioral.templatemethod; /**
* 设计模式课程,
* 业务场景:不用编写手记
*/
public class DesignPatternCourse extends ACourse{
/**
* 不同子类实现不同包装方法
*/
@Override
void packageCourse() {
System.out.println("后端包装方法实现");
}
}
打印结果:
=======================后端课程开始
开始制作PPT
制作课程视频
后端包装方法实现
=======================后端课程结束
=======================前端课程开始
开始制作PPT
制作课程视频
提供课程前端代码
提供课程图片素材
=======================前端课程结束 Process finished with exit code 0
1.2 代码演练2(后端课程子类运用钩子方法,加入写手记的方法)
重点:
后端课程子类
后端课程子类:
package com.geely.design.pattern.behavioral.templatemethod; /**
* 设计模式课程,
* 业务场景:不用编写手记
*/
public class DesignPatternCourse extends ACourse{
/**
* 钩子方法,后端课程加入编写手记方法
* @return
*/
@Override
protected boolean needMakeArticle() {
return true;
} /**
* 不同子类实现不同包装方法
*/
@Override
void packageCourse() {
System.out.println("后端包装方法实现");
}
}
前端课程子类:
package com.geely.design.pattern.behavioral.templatemethod;
public class FECourse extends ACourse{
/**
* 不同子类实现不同包装方法
*/
@Override
void packageCourse() {
System.out.println("提供课程前端代码");
System.out.println("提供课程图片素材");
}
}
课程类:
package com.geely.design.pattern.behavioral.templatemethod; /**
* 制作抽象类 课程类,用于被其他类继承
*/
public abstract class ACourse { /**
* 整合课程 的方法,
* 该流程是固定的,子类不能重写
*/
protected final void makeCourse(){
makePPT();
makeVideo();
if(needMakeArticle()){
makeArticle();
}
packageCourse();
}
/**
* 制作PPT 方法
* 目的:如果想要每个子类都不能重写该方法,就用final修饰
* 原因:每个子类都必须有制作PPT的方法
*/
final void makePPT(){
System.out.println("开始制作PPT");
} /**
* 同上
*/
final void makeVideo(){
System.out.println("制作课程视频");
} /**
* 制作手记方法
* 该方法不可被重写
* 有的课程需要制作,有的课程不需要
*/
final void makeArticle(){
System.out.println("编写手记");
} /**
* 添加钩子方法
* 该方法可被子类重写,用于判断子类是否需要制作手记
* @return
*/
protected boolean needMakeArticle(){
return false;
} /**
* 包装课程方法,
* 目的:不同的课程,包装的素材也不一样,所以声明抽象的,子类可以重写
*/
abstract void packageCourse();
}
测试类:
package com.geely.design.pattern.behavioral.templatemethod;
public class Test {
public static void main(String [] args){
System.out.println("=======================后端课程开始");
ACourse aCourse1 = new DesignPatternCourse();
aCourse1.makeCourse();
System.out.println("=======================后端课程结束");
System.out.println("=======================前端课程开始");
ACourse aCourse2 = new FECourse();
aCourse2.makeCourse();
System.out.println("=======================前端课程结束");
}
}
打印日志:
=======================后端课程开始
开始制作PPT
制作课程视频
编写手记
后端包装方法实现
=======================后端课程结束
=======================前端课程开始
开始制作PPT
制作课程视频
提供课程前端代码
提供课程图片素材
=======================前端课程结束 Process finished with exit code 0
1.3 代码演练3(前端有多个子类,有得需要写手记,有得不需要写,如何实现?)
解决方案:
将是否需要手记这个字段开放给应用层,这样使用起来更加灵活
uml类图:

重点看:
测试类和前端子类
测试类:
package com.geely.design.pattern.behavioral.templatemethod;
public class Test {
public static void main(String [] args){
/* System.out.println("=======================后端课程开始");
ACourse aCourse1 = new DesignPatternCourse();
aCourse1.makeCourse();
System.out.println("=======================后端课程结束");*/
System.out.println("=======================前端课程开始");
ACourse aCourse2 = new FECourse(true);
aCourse2.makeCourse();
System.out.println("=======================前端课程结束");
System.out.println("=======================前端课程开始");
ACourse aCourse3 = new FECourse(false);
aCourse3.makeCourse();
System.out.println("=======================前端课程结束");
}
}
前端子类:
package com.geely.design.pattern.behavioral.templatemethod;
public class FECourse extends ACourse{
boolean bNeedMakeArticleFlag = false;
/**
* 用注入的方式 将该字段传入
* @param bNeedMakeArticleFlag
*/
public FECourse(boolean bNeedMakeArticleFlag) {
this.bNeedMakeArticleFlag = bNeedMakeArticleFlag;
}
/**
* 不同子类实现不同包装方法
*/
@Override
protected boolean needMakeArticle() {
return this.bNeedMakeArticleFlag;
}
@Override
void packageCourse() {
System.out.println("提供课程前端代码");
System.out.println("提供课程图片素材");
}
}
后端子类:
package com.geely.design.pattern.behavioral.templatemethod; /**
* 设计模式课程,
* 业务场景:不用编写手记
*/
public class DesignPatternCourse extends ACourse{
/**
* 钩子方法,后端课程加入编写手记方法
* @return
*/
@Override
protected boolean needMakeArticle() {
return true;
} /**
* 不同子类实现不同包装方法
*/
@Override
void packageCourse() {
System.out.println("后端包装方法实现");
}
}
课程类:
package com.geely.design.pattern.behavioral.templatemethod; /**
* 制作抽象类 课程类,用于被其他类继承
*/
public abstract class ACourse { /**
* 整合课程 的方法,
* 该流程是固定的,子类不能重写
*/
protected final void makeCourse(){
makePPT();
makeVideo();
if(needMakeArticle()){
makeArticle();
}
packageCourse();
}
/**
* 制作PPT 方法
* 目的:如果想要每个子类都不能重写该方法,就用final修饰
* 原因:每个子类都必须有制作PPT的方法
*/
final void makePPT(){
System.out.println("开始制作PPT");
} /**
* 同上
*/
final void makeVideo(){
System.out.println("制作课程视频");
} /**
* 制作手记方法
* 该方法不可被重写
* 有的课程需要制作,有的课程不需要
*/
final void makeArticle(){
System.out.println("编写手记");
} /**
* 添加钩子方法
* 该方法可被子类重写,用于判断子类是否需要制作手记
* @return
*/
protected boolean needMakeArticle(){
return false;
} /**
* 包装课程方法,
* 目的:不同的课程,包装的素材也不一样,所以声明抽象的,子类可以重写
*/
abstract void packageCourse();
}
打印结果:
=======================前端课程开始
开始制作PPT
制作课程视频
编写手记
提供课程前端代码
提供课程图片素材
=======================前端课程结束
=======================前端课程开始
开始制作PPT
制作课程视频
提供课程前端代码
提供课程图片素材
=======================前端课程结束 Process finished with exit code 0
设计模式课程 设计模式精讲 17-2 模板方法模式coding的更多相关文章
- 设计模式课程 设计模式精讲 13-2 享元模式coding
1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 每周由随机部门经历做报告: 重点关注: a 该案例是单例模式和享元模式共同使用 b 外部传入的department是外部状态 ...
- 设计模式课程 设计模式精讲 11-2 装饰者模式coding
1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...
- 设计模式课程 设计模式精讲 7-2 建造者模式Coding
1 代码演练 1.1 建造者模式演练 1.2 静态内部类演练建造者模式(链式调用) 1 代码演练 1.1 建造者模式演练 需求: 根据讲师提供的课程名称,课程ppt,课程视频,课程手记,课程问答 制作 ...
- CSharp设计模式读书笔记(23):模板方法模式(学习难度:★★☆☆☆,使用频率:★★★☆☆)
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中.模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式角色与结构: 实现代码: using System; ...
- javascript设计模式(张容铭)学习笔记 - 照猫画虎-模板方法模式
模板方法模式(Template Method):父类中定义一组操作算法骨架,而降一些实现步骤延迟到子类中,使得子类可以不改变父类的算法结构的同时可重新定义算法中某些实现步骤. 项目经理体验了各个页面的 ...
- 设计模式课程 设计模式精讲 6-2 抽象工厂coding
1 代码讲解 1.1 抽象工厂优点 1.2 抽象工厂缺点 1.3 为何有产品族的业务场景宜用抽象工厂设计模式?而不是工厂设计模式? 2 代码演练 2.1 抽象工厂代码演练 1 代码讲解 1.1 抽象工 ...
- 设计模式课程 设计模式精讲 18-2 迭代器模式coding
1 代码演练 1.1 代码演练1(迭代器模式演练) 1.2 代码使用场景 1 代码演练 1.1 代码演练1(迭代器模式演练) 需求: 课程管理:需要实现课程可进行增添,删除,并能够打印出课程列表. u ...
- 设计模式课程 设计模式精讲 5-2 工厂方法coding
1 课堂讲义 1.1 产品等级和产品簇 2 代码演练 2.1 工厂方法代码演练 1 课堂讲义 1.1 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...
- 设计模式课程 设计模式精讲 22-2 备忘录模式coding
1 代码演练 1.1 代码演练1 1 代码演练 1.1 代码演练1 需求: 网站笔记需要存储快照,能实现回退的功能. 注意: a 设计的时候,可以分为笔记类,笔记快照类和 笔记快照管理类 三个类. ...
随机推荐
- vscode解决java无法输入(scanner)问题
vscode解决java无法输入问题 需要先安装java环境,->windows安装java 新建Test.java 输入代码 import java.util.Scanner; public ...
- Spring Boot 操作 Excel
Excel 在日常操作中经常使用到,Spring Boot 中使用 POI 操作 Excel 本项目源码 github 下载 1 新建 Spring Boot Maven 示例工程项目 注意:本示例是 ...
- Linux创建连接命令 ln -s创建软连接
ln -s 是linux中一个非常重要命令,一定要熟悉.它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s, 具体用法是:ln -s 源文件 目标文件. 当 我们需要在 ...
- acwing练习
220. 最大公约数 给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对. GCD(x,y)即求x,y的最大公约数. 输入格式 输入一个整数N 输出格式 输出 ...
- Try-Catch无法正确定位异常位置,我推荐2个有效技巧
宇宙第一开发IDE Visual Studio的调试功能非常强大,平常工作debug帮助我们解决不少问题.今天分享两个异常捕获的技巧,希望能够帮助解决一些问题. 以下两种情况,我相信大家都会遇到过. ...
- jq基础(2)
jquery的选择器 基本选择器 id选择器:$(“#id名称”); 元素选择器:$(“元素名称”); 类选择器:$(“.类名”); 通配符:* 多个选择器共用(并集) 案例代码: <html& ...
- PyQt5复杂控件(树控件、选项卡控件(滚动条控件、多文档控件、停靠控件)
1.树控件的基本使用方法QTreeWidget'''QTreeWidget树控件的使用方法添加图标,添加表格,添加复选框等'''from PyQt5.QtWidgets import *from Py ...
- 连接数据库的url
mysql: jdbc:mysql://localhost:3306:test这句里面分如下解析:jdbc:mysql:// 是指JDBC连接方式:localhost: 是指你的本机地址:3306 S ...
- 吴裕雄 python 神经网络——TensorFlow 多线程队列操作
import tensorflow as tf queue = tf.FIFOQueue(100,"float") enqueue_op = queue.enqueue([tf.r ...
- Algorightm----DynamicProgramming
参考资料: 1. 告别动态规划,连刷40道动规算法题,我总结了动规的套路