定义:
定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。(行为型)
适应场景:
1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
2.各子类公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复。
有点:
1.提高复用性
2.提高扩展性
3.符合开闭原则
缺点:
1.类数目增加
2.增加了系统的复杂度
3.继承关系自身的缺点,如果父类
Coding:
ACourse
抽象模版方法
/**
* @program: design-pattern
* @description:
* @author: KingdomCoder
* @create: 2018/12/31 下午12:29
**/
public abstract class ACourse {
//课程制作流程不能被子类重写
protected final void makeCourse() {
this.makePPT();
this.makeVideo();
if(needWriteAticle()){
this.needWriteAticle();
}
this.packageCourse();
}
//制作PPT
final void makePPT() {
System.out.println("制作PPT");
}
//制作课程视频
final void makeVideo() {
System.out.println("制作课程视频");
}
//编写手记
final void writeArticle() {
}
//是否需要编写手记---可被子类重写(钩子方法)
protected boolean needWriteAticle() {
return false;
}
//抽象方法(每个课程的包装都不一样)
abstract void packageCourse();
}
DesignPatternCourse
通过钩子方法控制是否需要写手记
@AllArgsConstructor
@NoArgsConstructor
public class DesignPatternCourse extends ACourse{
private boolean needWriteArticle = false;
@Override
protected boolean needWriteAticle() {
return true;
}
@Override
void packageCourse() {
System.out.println("提供课程JAVA代码");
}
}
FECourser
子类实现自己的模版方法
/**
* @program: design-pattern
* @description:
* @author: KingdomCoder
* @create: 2018/12/31 下午12:37
**/
@AllArgsConstructor
@NoArgsConstructor
public class FECourser extends ACourse {
private boolean needWriteArticle = false;
@Override
protected boolean needWriteAticle() {
return needWriteArticle;
}
@Override
void packageCourse() {
System.out.println("提供前端代码");
System.out.println("提供前端多媒体素材");
}
}
Test
测试类:
/**
* @program: design-pattern
* @description:
* @author: KingdomCoder
* @create: 2018/12/31 下午12:39
**/
public class Test {
public static void main(String[] args) {
System.out.println("后端设计模式课程start----");
ACourse designPattern = new DesignPatternCourse();
designPattern.makeCourse();
System.out.println("后端设计模式end---");
System.out.println("前端设计模式课程start----");
//将是否写手记由应用层控制
ACourse feCourse = new FECourser(true);
feCourse.makeCourse();
System.out.println("前端设计模式end---");
}
}
测试结果为:
后端设计模式课程start----
制作PPT
制作课程视频
提供课程JAVA代码
后端设计模式end---
前端设计模式课程start----
制作PPT
制作课程视频
提供前端代码
提供前端多媒体素材
前端设计模式end---
Process finished with exit code 0
UML:
模版方法模式.png 微信公众号欢迎关注.jpg
网友评论