一、模板方法模式介绍1、定义与类型定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现 2、适用场景一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现 3、优点提高复用性 4、缺点类数目增加 5、扩展钩子方法 6、相关设计模式模板方法模式和工厂方法模式 模板方法模式和策略模式 二、代码示例模拟场景:制作课程,有些步骤和操作是固定的,但打包的时候每个课程都有自己的打包方式,并且课程不一定有手记 课程抽象类: 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(); } 课程实现类1: public class DesignPatternCourse extends ACourse { @Override void packageCourse() { System.out.println("提供课程Java源代码"); } @Override protected boolean needWriteArticle() { return true; } } 课程实现类2: public class FECourse extends ACourse { private boolean needWriteArticleFlag = false; @Override void packageCourse() { System.out.println("提供课程的前端代码"); 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) { System.out.println("后端设计模式课程start---"); ACourse designPatternCourse = new DesignPatternCourse(); designPatternCourse.makeCourse(); System.out.println("后端设计模式课程end---"); System.out.println("前端课程start---"); ACourse feCourse = new FECourse(false); feCourse.makeCourse(); System.out.println("前端课程end---"); } } 三、源码示例1、JDK中的AbstractListAbstractSet、AbstractMap同理 2、tomcat中的HttpServlet |
|
来自: python_lover > 《待分类》