B01 模板方法 示例

示例类图

模板方法模式.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
制作视频
提供课程的前端代码

你可能感兴趣的:(B01 模板方法 示例)