模板方法模式(Template Method Pattern)是如此简单,定义如下: Define the skeleton of an algorithm in an operation,deferring somes teps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法某些特定步骤

如类图定义如图所示:

模板方法模式(TemplatePattern) - 图1

模板方法模式确实非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式。其中AbstractClass叫做抽象模板,它的方法分为两类:

  • 基本方法

    基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。

  • 模板方法

    可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。 注意 为了防止恶意的操作,> 一般模板方法都加上final关键字,不允许被覆写。

抽象模板中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。实现类若非必要,尽量不要扩大父类中的访问权限。

  • 封装不变部分,扩展可变部分
  • 提取公共部分代码,便于维护
  • 行为由父类控制,子类实现
  • 带来代码阅读的难度,而且也会让新手产生不适感

    1、代码示例

我们有不同的任务需要执行,抽象代码如下:

  1. // 定义抽象类
  2. abstract class Task {
  3. abstract void start();
  4. abstract void exec();
  5. abstract void stop();
  6. abstract void runTask();
  7. }

分别实现 ReadTask & WriteTask

  1. class ReadTask extends Task {
  2. @Override
  3. void start() {
  4. System.out.println("开始阅读");
  5. }
  6. @Override
  7. void exec() {
  8. System.out.println("正在阅读");
  9. }
  10. @Override
  11. void stop() {
  12. System.out.println("停止阅读");
  13. }
  14. @Override
  15. void runTask() {
  16. start();
  17. exec();
  18. stop();
  19. }
  20. }
  21. class WriteTask extends Task {
  22. @Override
  23. void start() {
  24. System.out.println("开始写作");
  25. }
  26. @Override
  27. void exec() {
  28. System.out.println("正在写作");
  29. }
  30. @Override
  31. void stop() {
  32. System.out.println("结束写作");
  33. }
  34. @Override
  35. void runTask() {
  36. start();
  37. exec();
  38. stop();
  39. }
  40. }


创建这两个任务并且运行,代码以及输出结果如下:

  1. public static void main(String[] args) {
  2. Task readTask = new ReadTask();
  3. readTask.runTask();
  4. Task writeTask = new WriteTask();
  5. writeTask.runTask();
  6. }
  7. 开始阅读
  8. 正在阅读
  9. 停止阅读
  10. 开始写作
  11. 正在写作
  12. 结束写作

1.1、 代码分析

上面的代码中,我们发现runTask 的到吗是重复的,我们使用下面的类图实现。

  1. // 定义抽象类
  2. abstract static class Task {
  3. abstract void start();
  4. abstract void exec();
  5. abstract void stop();
  6. final void runTask() {
  7. start();
  8. exec();
  9. stop();
  10. }
  11. }

修改类的类图如下:

模板方法模式(TemplatePattern) - 图2