> For the complete documentation index, see [llms.txt](https://yangsx95.gitbook.io/notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yangsx95.gitbook.io/notes/computer-science/she-ji-mo-shi/mu-ban-fang-fa-mo-shi.md).

# 模板方法模式

Template Method Pattern，在操作中定义算法的框架，将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。

个人理解：抽取多个相同流程代码的类似的部分到一个Abstract类中，并暴露一些抽象方法（不同点）或者钩子方法给每个不同的子类实现。在业务代码中，同一实体但是类别不同且**处理过程类似**的情况较多使用这个模式。

> 钩子方法是已经实现的方法，可以选择性的重写

## 应用场景

JUC：

1. AbstractExecutorService主要实现了submit、invokeAny、invokeAll方法，在这些方法中，都写入了一些模板代码，比如判空与调用execute抽象方法执行任务。
2. AQS

开发场景：

1. 合同服务，多种合同的处理过程类似，抽取了一个Abstract类，在类中按照固定的流程处理不同的合同，每个合同都有一个实现类，并重写一些钩子函数，这些钩子函数就是每个合同的不同点。

## 优缺点

缺点：

1. 每个不同的实现都要定义一个子类，将会导致子类个数增加，系统更加庞大，设计也更为抽象
2. 父类的方法由子类实现，子类的执行结果将会影响父类，提高了代码阅读的难度
