模板方法模式

模板方法(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(); } }
点击并拖拽以移动

模板方法模式的优缺点

优点:

  • 代码复用:模板方法模式通过在父类中定义公共部分,子类只需要实现不同的部分,避免了代码重复。
  • 易于扩展:新增不同的文档处理方式,只需要创建新的子类并实现特定的处理步骤,不需要修改现有的代码。
  • 算法框架不变:父类定义的算法框架保持不变,子类只负责实现特定的步骤。

缺点:

  • 类的数量增加:每个特定的实现步骤都需要一个子类,这可能导致类的数量增多。
  • 子类过度依赖父类:模板方法模式会导致子类过度依赖父类的模板方法,子类的灵活性可能受到限制。

工厂方法模式 是模板方法模式的一种特殊形式。同时,工厂方法可以作为一个大型模板方法中的一个步骤。

一步登天终是痴心妄想,厚积薄发才是人间真理。-- 烟沙九洲