示例类图
模板方法模式.png
示例代码
模板类
- makeCourse() 就是模板方法,其定义了一个算法的模板,即步骤;
- 对于不允许子类改变的步骤,用 final 修饰;
- final void makePPT();
- final void makeVideo();
- final void writeArticle();
- 钩子方法:protected boolean needWriteArticle(),可以对模板方法中的某个步骤在子类中是否执行做控制;
- 允许子类重写的方法用抽象方法表示:abstract void packageCourse();
public abstract class ACourse {
protected final void makeCourse(){
this.makePPT();
this.makeVideo();
if(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();
}
模板方法的具体实现
public class DesignPatternCourse extends ACourse {
@Override
void packageCourse() {
System.out.println("提供课程Java源代码");
}
@Override
protected boolean needWriteArticle() {
return true;
}
}
public class FECourse extends ACourse {
private boolean needWriteArticleFlag = false;
@Override
void packageCourse() {
System.out.println("提供课程的前端代码");
}
public FECourse(boolean needWriteArticleFlag) {
this.needWriteArticleFlag = needWriteArticleFlag;
}
@Override
protected boolean needWriteArticle() {
return this.needWriteArticleFlag;
}
}
客户端
public class Test {
public static void main(String[] args) {
ACourse designPatternCourse = new DesignPatternCourse();
designPatternCourse.makeCourse();
System.out.println();
ACourse feCourse = new FECourse(false);
feCourse.makeCourse();
}
}
输出:
制作PPT
制作视频
编写手记
提供课程Java源代码
制作PPT
制作视频
提供课程的前端代码