模板方法 - 定义与类型
1.定义
定义了一个算法的骨架,并可以子类为一个或多个步骤提供现实
1.1 特点
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
1.2 类型 : 行为型
2.适用场景
1、一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
2、各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复
3.缺点
1.类数目增加
2.增加了系统实现的复杂度
3.继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍
4.优点
1.提高复用性
2.提高扩展性
3.符合开闭原则
5.模板方法-扩展
钩子方法
6.模板方法-相关设计模式
模板方法模式和工厂方法模式
模板方法模式和策略模式
策略模式改变算法流程
模板方法模式 不该变算法流程 而是交给子类去实现
7.uml 设计图
8.代码如下
package com.zw.design.pattern.creational.behavioral.templatemetod;
public abstract class ACourse {
protected final void makeCourse(){
this.makePPT();
this.makeVideo();
//钩子方法判断
if (this.needWriteArticle()){
this.writeArticle();
}
this.packageCourse();
}
final void makePPT(){
System.out.println("编写ppt");
}
final void makeVideo(){
System.out.println("编写视频");
}
final void writeArticle(){
System.out.println("编写手记");
}
//钩子方法
protected boolean needWriteArticle(){
return false;
}
abstract void packageCourse();
}
package com.zw.design.pattern.creational.behavioral.templatemetod;
public class IOSCourse extends ACourse{
@Override
void packageCourse() {
System.out.println("提供课程的IOS 代码");
System.out.println("提供课程的图片等");
}
private boolean needWriteArticle;
public IOSCourse(boolean needWriteArticle) {
this.needWriteArticle = needWriteArticle;
}
@Override
protected boolean needWriteArticle() {
return this.needWriteArticle;
}
}
package com.zw.design.pattern.creational.behavioral.templatemetod;
public class SpringCourse extends ACourse{
@Override
void packageCourse() {
System.out.println("提供spring源码课程代码");
}
@Override
protected boolean needWriteArticle() {
return true;
}
}
3.测试类
package com.zw.design.pattern.creational.behavioral.templatemetod;
public class Test {
public static void main(String[] args) {
System.out.println("后端课程spring 课程 start");
ACourse springCourse=new SpringCourse();
springCourse.makeCourse();
System.out.println("后端课程spring 课程 end");
//1.0版本 现在IOS没有写手记 该如何去做了?
// System.out.println("前端课程IOS 课程 start");
// ACourse ios=new IOSCourse();
// ios.makeCourse();
// System.out.println("前端课程IOS 课程 end");
//比如IOS 我现在有一个需求 IOS 分为 OS 和另外一种语言 OS 需要写手记
System.out.println("前端课程IOS 课程 start");
ACourse ios=new IOSCourse(true);//OS 写手记
ios.makeCourse();
System.out.println("前端课程IOS 课程 end");
System.out.println("前端课程IOS 课程 start");
ACourse ios2=new IOSCourse(false);//OS 不写手记
ios2.makeCourse();
System.out.println("前端课程IOS 课程 end");
}
}
测试结果如下
代码如下
模板设计—源码解析
在jdk当中 AbstractList
这个类当中 使用模板方法
还有在servlet 当中 HttpServlet
当中使用的
在mybatis 当中的应用 BaseExecutor
的应用 使用模板方法模式