模板方法模式

模板方法(Template Method)模式属于行为型模式的一种。

模板方法模式定义了一个操作中的算法骨架,并将一些步骤延迟到子类中实现。

模板方法模式的核心思想是:父类定义骨架,子类实现某些细节。

模板方法模式允许子类在不改变算法结构的情况下,重新定义算法中的某些特定步骤。

Java标准库有很多模板方法模式的应用。比如集合类中的AbstractList、AbstractQueuedSynchronizer等类。

模板方法模式基于继承机制。模板方法模式在类层次上运作,因此它是静态的。

模板方法模式适用于那些具有相同算法结构,但步骤实现不同的场景,比如数据处理、文件解析等。

模板方法模式通常有以下组成部分:

  • 抽象类(Abstract Class):包含了一个模板方法,这个方法定义了一个固定的算法步骤。在模板方法中,某些步骤是固定的,而一些具体的步骤会留给子类去实现。
  • 具体类(Concrete Class):继承自抽象类,并实现其中定义的抽象方法,完成特定步骤的执行。

我们简单模拟一个处理文档的系统,如处理 Word 文档和 PDF 文档有所不同。

1、抽象类

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、具体类

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、客户端

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

模板方法模式的优缺点

优点:

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

缺点:

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

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

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

你可能感兴趣的:(设计模式,模板方法模式,java)