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

最新文章

  1. 正则表达式之g标志,match和 exec
  2. PHP AJAX上传文件
  3. 如何重现难以重现的bug
  4. python命令行参数
  5. 一个对称加密、解密的方法C#工具类
  6. sonar 代码质量管理平台
  7. linux 常用软件安装-目录
  8. 【HDOJ】3007 Buried memory
  9. birt 运行环境搭建(部署到tomcat)
  10. 淘宝接口实现ip归属地查询
  11. 转的git
  12. PLSQL僵死
  13. SQL Server 数据库中的异常信息与编号
  14. 一天一个Linux命令--dhclient
  15. (78)Wangdao.com第十五天_JavaScript 面向对象
  16. C++ 编译发现 error C2146: syntax error : missing ';' before identifier 'm_ctrlserver'
  17. vim编辑器中没有高亮显示,退格键不能使用的问题
  18. 把composer的源切换为 国际的源
  19. JMeter学习(八)JDBC测试计划-连接Oracle(转载)
  20. rabbitmq学习(一) —— 安装篇

热门文章

  1. sping中AOP
  2. 台电X16pro刷机记录
  3. Springboot项目搭建(2)-整合静态文件
  4. 分布式一致性协议 --- Paxos
  5. hadoop学习笔记(二):hdfs优点和缺点
  6. python 创建虚拟环境:bat实现一键
  7. 《实战Java高并发程序设计》读书笔记二
  8. kafka connector
  9. 用java代码打印九九乘法表
  10. Mapgis地图颜色配置(专题图配置)----对比Arcgis根据属性配置图斑颜色