1、不使用模板方法设计模式

1.1 Student类

  1. public class Student {
  2. System.out.println("学生起床");
  3. System.out.println("学生上课");
  4. System.out.println("学生放学");
  5. }

1.2 Worker类

  1. public class Worker {
  2. System.out.println("工人起床");
  3. System.out.println("工人上班");
  4. System.out.println("工人下班");
  5. }

1.3 问题

  • Student和Worker……它们的核心骨架是相同的
  • 算法既然相同,为什么要在每个类中都写一遍???
  • 这样做使得代码冗余……

    2、使用模板方法设计模式

    2.1 代码

    ```java public abstract class PersonTemplate { /**
    • templateMethod是一个模版方法,定义核心算法骨架,具体的实现步骤延迟到子类中完成
    • 算法为了受到保护,所以模版方法一般都使用final修饰,不被重写
    • 核心算法骨架不需要每一次在具体的类中编写了,这个核心算法只在模版方法中编写一次
    • 算法步骤改变,只要更改模版就可以,同时也避免了算法在每一个具体的类中编写而冗余 / public final void templateMethod() { //核心算法骨架 do1(); do2(); do3(); } /*
    • 这就是具体的实现,这个具体的步骤可以延迟到子类中完成
    • 这个方法通常是抽象方法 */ protected abstract void do1(); protected abstract void do2(); protected abstract void do3(); }

//Student子类 public class Student extends PersonTemplate { @Override protected void do1() { System.out.println(“学生起床”); }

@Override
protected void do2() {
    System.out.println("学生上课");
}

@Override
protected void do3() {
    System.out.println("学生放学");
}

}

//Worker子类 public class Worker extends PersonTemplate{ @Override protected void do1() { System.out.println(“工人起床”); }

@Override
protected void do2() {
    System.out.println("工人上班");
}

@Override
protected void do3() {
    System.out.println("工人下班");
}

}

//测试类 public class Test { public static void main(String[] args) { PersonTemplate p1 = new Student(); p1.templateMethod();

    PersonTemplate p2 = new Worker();
    p2.templateMethod();
}

} ```

2.2 总结

  • 模版方法设计模式属于行为型设计模式
  • 模版方法有一个特点:doXXX()
  • 模板方法设计模式的例子
    • Servlet规范中的HttpServlet
    • HttpServlet就是一个典型的模板方法设计模式
    • HttpServlet是一个模板类
    • 其中的service(HttpServletRequest, HttpServletResponse)方法是典型的模板方法,该方法中定义了核心算法骨架,doGet()、doPost()……具体的实现细节延迟到子类中完成
  • 模板方法设计模式的主要作用:
    1. 核心算法得到保护
    2. 核心算法得到复用
    3. 在不改变算法的前提下,却可以重新定义算法步骤的具体实现