模板方法(Template Method)模式属于行为型模式的一种。
模板方法模式定义了一个操作中的算法骨架,并将一些步骤延迟到子类中实现。
模板方法模式的核心思想是:父类定义骨架,子类实现某些细节。
模板方法模式允许子类在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
Java标准库有很多模板方法模式的应用。比如集合类中的AbstractList、AbstractQueuedSynchronizer等类。
模板方法模式基于继承机制。模板方法模式在类层次上运作,因此它是静态的。
模板方法模式适用于那些具有相同算法结构,但步骤实现不同的场景,比如数据处理、文件解析等。
模板方法模式通常有以下组成部分:
- 抽象类(Abstract Class):包含了一个模板方法,这个方法定义了一个固定的算法步骤。在模板方法中,某些步骤是固定的,而一些具体的步骤会留给子类去实现。
- 具体类(Concrete Class):继承自抽象类,并实现其中定义的抽象方法,完成特定步骤的执行。
我们简单模拟一个处理文档的系统,如处理 Word 文档和 PDF 文档有所不同。
1、抽象类
java
abstract class DocumentProcessor {
// 模板方法
public final void processDocument() { readDocument(); processContent(); saveDocument(); } // 固定的步骤 private void readDocument() { System.out.println("Reading document..."); } private void saveDocument() { System.out.println("Saving document..."); } // 需要子类具体实现的步骤 protected abstract void processContent(); }

2、具体类
java
class WordDocumentProcessor extends DocumentProcessor {
@Override protected void processContent() { System.out.println("Processing Word document content..."); } } class PDFDocumentProcessor extends DocumentProcessor { @Override protected void processContent() { System.out.println("Processing PDF document content..."); } }

3、客户端
java
public class Main {
public static void main(String[] args) { DocumentProcessor wordProcessor = new WordDocumentProcessor(); wordProcessor.processDocument(); System.out.println("---------------"); DocumentProcessor pdfProcessor = new PDFDocumentProcessor(); pdfProcessor.processDocument(); } }

模板方法模式的优缺点。
优点:
- 代码复用:模板方法模式通过在父类中定义公共部分,子类只需要实现不同的部分,避免了代码重复。
- 易于扩展:新增不同的文档处理方式,只需要创建新的子类并实现特定的处理步骤,不需要修改现有的代码。
- 算法框架不变:父类定义的算法框架保持不变,子类只负责实现特定的步骤。
缺点:
- 类的数量增加:每个特定的实现步骤都需要一个子类,这可能导致类的数量增多。
- 子类过度依赖父类:模板方法模式会导致子类过度依赖父类的模板方法,子类的灵活性可能受到限制。
工厂方法模式 是模板方法模式的一种特殊形式。同时,工厂方法可以作为一个大型模板方法中的一个步骤。
一步登天终是痴心妄想,厚积薄发才是人间真理。-- 烟沙九洲