1.定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现;
模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。2.类型:行为型
3.适用场景:一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现;
各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复。4.优点:提高复用性、提供扩展性、符合开闭原则。
5.缺点:类数目增加,增加了系统实现的复杂度;继承关系自身缺点,
如果父类添加新的抽象方法,所有子类都要改一遍。6.扩展:钩子方法
7.相关设计模式:工厂方法模式、策略模式。
8.实例目录package
9.实例UML类图
10.代码
1 package com.geely.design.pattern.behavioral.templatemethod; 2 3 public abstract class ACourse { 4 protected final void makeCourse(){ 5 makePPT(); 6 makeVideo(); 7 if(needWriteArticle()){ 8 writeArtile(); 9 }10 packageCourse();11 }12 13 final void makePPT(){14 System.out.println("制作PPT");15 }16 final void makeVideo(){17 System.out.println("制作视频");18 }19 final void writeArtile(){20 System.out.println("编写手记");21 }22 23 protected boolean needWriteArticle(){24 return false;25 }26 27 abstract void packageCourse();28 }
1 package com.geely.design.pattern.behavioral.templatemethod; 2 3 public class DesignPatternCourse extends ACourse { 4 @Override 5 protected boolean needWriteArticle() { 6 return true; 7 } 8 9 @Override10 void packageCourse() {11 System.out.println("提供课程Java源代码");12 }13 }
1 package com.geely.design.pattern.behavioral.templatemethod; 2 3 public class FECourse extends ACourse{ 4 private boolean needWriteActicleFlag = false; 5 6 public FECourse(boolean needWriteActicleFlag) { 7 this.needWriteActicleFlag = needWriteActicleFlag; 8 } 9 10 @Override11 protected boolean needWriteArticle() {12 return needWriteActicleFlag;13 }14 15 @Override16 void packageCourse() {17 System.out.println("提供课程前端代码");18 System.out.println("提供课程的图片等多媒体素材");19 }20 }
1 package com.geely.design.pattern.behavioral.templatemethod; 2 3 public class Test { 4 public static void main(String[] args) { 5 System.out.println("后端设计模式课程start---"); 6 ACourse designPatternCourse = new DesignPatternCourse(); 7 designPatternCourse.makeCourse(); 8 System.out.println("后端设计模式课程end---"); 9 10 System.out.println("前端课程start---");11 ACourse feCourse = new FECourse(true);12 feCourse.makeCourse();13 System.out.println("前端课程end---");14 }15 }