一、模板方法模式定义

1.模板方法模式,指定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特性步骤,属于行为型模式

2.模板方法模式实际上是封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同实现,从而让固定流程产生不同的结果。它非常简单,其实就是类的继承机制,但它却是一个应用非常广泛的模式。模板方法模式的本质是抽象封装流程,具体进行实现

3.模板方法模式的适用场景:

  A.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现

  B.各子类中公共的行为被提取出来并集中到一个公共的父类中,从而避免代码重复

二、模板方法模式示例

1.模板方法模式主要包含两种角色:

  A.抽象模板(AbstractClass):抽象模板类,定义了一套算法框架/流程

  B.具体实现(ConcreteClass):具体实现类,对算法框架/流程的某些步骤进行了实现

2.模板方法模式中的钩子方法:设计钩子方法的主要目的是用来干预执行流程,使得我们控制行为流程更加灵活,更符合实际业务的需要。钩子方法的返回值一般为适合条件分支语句的返回值(如boolean、int等)

3.代码示例

 1 public abstract class AbstractCourse {
 2     public final void createCourse(){
 3         //1.发布预习资料
 4         postPreResource();
 5         //2.制作课件
 6         createPPT();
 7         //3.直播授课
 8         liveVideo();
 9         //4.上传课后资料
10         postResource();
11         //5.布置作业
12         postHomework();
13 
14         if(needCheckHomework()){
15             checkHomework();
16         }
17     }
18 
19     protected abstract void checkHomework();
20 
21     //钩子方法
22     private boolean needCheckHomework() {
23         return false;
24     }
25 
26     private void postHomework() {
27         System.out.println("布置作业");
28     }
29 
30     private void postResource() {
31         System.out.println("上传课后资料");
32     }
33 
34     private void liveVideo() {
35         System.out.println("直播授课");
36     }
37 
38     private void createPPT() {
39         System.out.println("制作课件");
40     }
41 
42     private void postPreResource() {
43         System.out.println("发布预习资料");
44     }
45 }
46 
47 public class JavaCourse extends AbstractCourse {
48 
49     private boolean needCheckHomework =  false;
50 
51     public void setNeedCheckHomework(boolean needCheckHomework){
52         this.needCheckHomework = needCheckHomework;
53     }
54 
55     protected boolean isNeedCheckHomework(){
56         return this.needCheckHomework;
57     }
58 
59     @Override
60     protected void checkHomework() {
61         System.out.println("检查java作业");
62     }
63 }
64 
65 public class PythonCourse extends AbstractCourse {
66 
67     @Override
68     protected void checkHomework() {
69         System.out.println("检查python作业");
70     }
71 }
72 
73 public class MoldTest {
74     public static void main(String[] args) {
75         JavaCourse javaCourse = new JavaCourse();
76         javaCourse.setNeedCheckHomework(false);
77         javaCourse.createCourse();
78     }
79 }

4.模板方法模式的优缺点:

  A优点

    a.利用模板方法将相同处理逻辑的代码放到抽象类中,可以提高代码的复用性

    b.将不同的代码写到不同的子类中,通过对子类的扩展增加新的行为,提高代码的扩展性

    c.把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则

  B.缺点

    a.类数目增加,每一个抽象类都需要一个子类来实现,这样导致类的个数增加

    b.类数量的增加,间接的增加了系统实现的复杂度

    c.继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍