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
制作视频
提供课程的前端代码
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容