模板方法模式

概述

TemplateMethod 模板方法模式即由父类定义算法逻辑骨架,由子类提供具体逻辑步骤的实现。

《设计模式:可复用面向软件的基础》讨论了以下案例:应用框架 Application 类负责打开一个外部存储的文档,应用就会将文档表示为 Document 对象。基于 Application、Document 框架,实现具体逻辑的子类如绘图应用中的 DrawApplication、DrawDocument;电子表格应用中的 SpreadsheetApplication、SpreadsheetDocument。这些子类可实现父类中定义的抽象编程接口,如以下示例中的 canOpenDocument、doCreateDocument、aboutToOpenDocument 等,openDocument 即模板方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Application {
docs: Document[];
openDocument(name: string){
if (!this.canOpenDocument(name)){
return;
}

const doc = this.doCreateDocument();
if (doc){
this.docs.addDocument(doc);
this.aboutToOpenDocument(doc);
doc.open();
doc.doRead();
}
}
}

在模板方法模式中,由父类实现不变的部分,再由子类实现可变的部分。

结构

  • AbstractClass:定义抽象的原语操作以及串联原语操作的算法骨架,由具体的子类将实现特定的处理步骤。
  • ConcreteClass:实现包含特定逻辑的原语操作。在协作上,由父类决定使用子类的哪个方法。

AbstractClass 中由子类实现的空操作也被称为 hook operations 钩子操作。

在实现上,原语操作越少,意味着子类实现约易被理解。为原语操作添加统一的前缀也便于识别,如 ‘do-‘ 等前缀。