定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
模板方法使得子类可以在不改变算法的结构的情况下,重新定义算法的某些步骤
类型:行为型
一次性实现一个算法的不变的部分,并将可变的行为留给子类实现
各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复
优点:
提高复用性
提高扩展性
符合开闭原则
缺点:
类数目增加
增加了系统实现的复杂度
继承关系自身缺点,如果父类添加新的抽象方法,所有子类都需要改一遍
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 DesignOatternCourse extends ACourse { @Override void packageCourse() { System.out.println("提供JAVA源代码"); } @Override protected boolean needWriteArticle() { return true; } }
public class FECourse extends ACourse { private boolean needWriteAritcleFlag=false; @Override void packageCourse() { System.out.println("提供图片"); System.out.println("提供视频"); } public FECourse(boolean needWriteAritcleFlag) { this.needWriteAritcleFlag = needWriteAritcleFlag; } @Override protected boolean needWriteArticle() { return this.needWriteAritcleFlag; } }
public class Test { public static void main(String[] args) { // System.out.println("后端设计模式课程start---"); // ACourse designPatternCourse=new DesignOatternCourse(); // designPatternCourse.makeCourse(); // System.out.println("后端设计模式课程end---"); System.out.println("前段设计模式课程start---"); ACourse feCourse=new FECourse(false); feCourse.makeCourse(); System.out.println("前段设计模式课程end---"); } }