目录
一、模板方法模式的定义与类型
- 一、模板方法模式的定义与类型
- 二、模板方法模式的适用场景
- 三、模板方法模式的优点
- 四、模板方法模式的缺点
- 五、模板方法模式的扩展
- 六、模板方法模式的相关设计模式
- 七、模板方法模式示例
1、定义
- 定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
- 模板方法使得子类在不改变算法结构的情况下,重新定义算法的某些步骤
2、类型
- 行为型
- 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
- 各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复
- 提高复用性
- 提高扩展性
- 符合开闭原则
- 类数目增加
- 增加了系统实现的复杂度
- 继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍
- 钩子方法
- 模板方法模式和工厂方法模式
- 模板方法模式和策略模式
通过制作课程的模板类(Course)演示模板方法模式
1、创建一个抽象的课程类接口
package com.rf.designPatterns.behavioral.templateMethod;
/**
* @description: 创建一个抽象的课程类接口
* @author: xz
*/
public abstract class Course {
/**
* 制作课程方法
* final修饰不希望子类覆盖此方法
*/
protected final void makeCourse(){
this.makePPT();
this.makeVideo();
//调用钩子方法,返回true时调用写笔记方法
if(needWriteNotes()){
writeNotes();
}
this.packageCourse();
}
/**
* 制作ppt方法
* final修饰不希望子类覆盖此方法
*/
final void makePPT(){
System.out.println("制作ppt");
}
/**
* 制作视频方法
* final修饰不希望子类覆盖此方法
*/
final void makeVideo(){
System.out.println("制作视频");
}
/**
* 写笔记方法
* final修饰不希望子类覆盖此方法
*/
final void writeNotes(){
System.out.println("写笔记");
}
//钩子方法
protected boolean needWriteNotes(){
return false;
}
//包装课程方法,交给子类实现
abstract void packageCourse();
}
2、创建一个java课程类
package com.rf.designPatterns.behavioral.templateMethod;
/**
* @description: 创建一个设计模式课程类
* @author: xz
*/
public class JavaCourse extends Course{
//重写包装课程类
@Override
void packageCourse() {
System.out.println("提供课程java源码");
}
//在子类中实现是否需要写笔记方法
@Override
protected boolean needWriteNotes() {
return true;
}
}
3、创建一个Vue课程类
package com.rf.designPatterns.behavioral.templateMethod;
/**
* @description: 创建一个Vue课程类
* @author: xz
*/
public class VueCourse extends Course{
private boolean needWriteNotesFlag=false;
//通过构造器注入
public VueCourse(boolean needWriteNotesFlag) {
this.needWriteNotesFlag = needWriteNotesFlag;
}
//重写包装课程类
@Override
void packageCourse() {
System.out.println("提供课程vue源码");
}
//在应用端传参数实现是否需要写笔记
@Override
protected boolean needWriteNotes() {
return this.needWriteNotesFlag;
}
}
4、创建测试类
package com.rf.designPatterns.behavioral.templateMethod;
/**
* @description: 创建测试类
* @author: xz
*/
public class Test {
public static void main(String[] args) {
System.out.println("后端设计模式课程 start======");
Course javaCourse= new JavaCourse ();
javaCourse.makeCourse();
System.out.println("后端设计模式课程 end======");
System.out.println("");
System.out.println("前端vue课程 start======");
Course vueCourse = new VueCourse(false);
vueCourse.makeCourse();
System.out.println("前端vue课程 end======");
}
}
5、运行结果如下: 6、UML类图如下: