文章目录
1.课程目标
1.学会用模板模式梳理使用工作中流程标准化的业务场景。
2.通过学习适配模式,优雅地解决代码功能的兼容问题。
3.了解JDK源码和spring源码中对模板模式的运用
2.内容定位
1.深刻了解模板模式和适配器模式的应用场景
2.定位高级课程
3.模板模式
3.1模板模式的定义
1.模板模式通常又叫做模板方法模式(Template Method Pattern)是指定义一个算法的骨架,并允许子类为一个或者多个步骤提供实现。
2.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。
3.属于行为性设计模式
3.2 模板模式的适用场景
1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
2.各子类中公共的行为被提取出来并集到一个公共的父类中,从而避免代码重复
3.3 Demo案例
1.上课案例
课程模板规范抽象类
/**
* @PackageName: com.raven.pattern.template.course
* @ClassName: NetworkCourse
* @Blame: raven
* @Date: 2021-08-03 16:17
* @Description: 上网课案例:
* 定义课程模板类,规范创建课程的步骤
* 模板方法模式使用抽象类规定整个流程
*/
public abstract class AbstractNetworkCourse {
protected final void createCourse() {
// 1.发布预习资料
this.releasePreviewMaterials();
// 2.准备PPT
this.preparePPT();
// 3.在线授课
this.onlineDelivery();
// 4.提交课件
this.postNote();
// 5.提交作业
// 判断是否需要作业,子类继承时指定,如果布置了作业才需要提交作业
if (needHomework()) {
this.submitJob();
}
}
/**
* 钩子方法,实现流程的微调
* @return
*/
protected boolean needHomework() {
return false;
}
/**
* 如果布置作业,则需要提交作业,具体有没有作业,由子类自定义
*/
abstract void submitJob();
/**
* 使用final定义方法,子类不能够覆盖重写
*/
final void postNote() {
System.out.println("老师发课件了~");
}
final void onlineDelivery() {
System.out.println("老师在线授课啊");
}
final void preparePPT() {
System.out.println("老师在准备PPT啊");
}
final void releasePreviewMaterials() {
System.out.println("老师发预习资料了~");
}
}
课程类
public class GoCourse extends AbstractNetworkCourse {
@Override
void submitJob() {
System.out.println("Go 语言不需要作业");
}
}
public class JavaCourse extends AbstractNetworkCourse {
private boolean needHomeworkFlag;
public JavaCourse(boolean needHomeworkFlag) {
this.needHomeworkFlag = needHomeworkFlag;
}
/**
* 流程微调,通过构造参数来确定是否执行 提交作业的逻辑
* @return
*/
@Override
public boolean needHomework() {
return needHomeworkFlag;
}
@Override
void submitJob() {
System.out.println("如果java老师有布置作业,我就写!");
}
}
Main
public class CourseTest {
public static void main(String[] args) {
System.out.println("GO GO GO !");
GoCourse goCourse = new GoCourse();
goCourse.createCourse();
System.out.println("==========================");
System.out.println("JAVA JAVA JAVA !");
JavaCourse javaCourse = new JavaCourse(true);
javaCourse.createCourse();
System.out.println("==========================");
JavaCourse javaCourse2 = new JavaCourse(false);
javaCourse2.createCourse();
}
}
2.JDBC案例
jdbc模板规范接口
/**
* @PackageName: com.raven.pattern.template.jdbc
* @ClassName: RowMapper
* @Blame: raven
* @Date: 2021-08-03 20:44
* @Description: ORM映射定制化的接口
* 定义一个模板规范,所有的结果映射都需要执行这个接口
*/
public interface RowMapper<T> {
/**
* 规范结果映射
* @param rs
* @param rowNum 数据的行数
* @return 映射返回的数据
* @throws Exception
*/
T mapRow