欢迎来到 TypeScript 中的设计模式系列,它介绍了使用TypeScript进行Web开发的一些有用的设计模式。
系列文章如下:
- 设计模式:(Strategy Pattern)策略模式
- 设计模式:(Builder Pattern)生成器模式
- 设计模式:(Chain of Responsibility Pattern)责任链模式
- 设计模式:(Observer Pattern)观察者模式
- 适配器模式:(Adapter Pattern)适配器模式
设计模式对 Web 开发人员来说非常重要,我们可以通过掌握它们来编写更好的代码。在本文中,我将使用TypeScript来介绍责任链模式。
模板方法模式由两部分组成:抽象父类和具体实现子类。通常,子类的算法实现封装在抽象父类中,还包括一些公共方法以及封装的子类中所有方法的执行顺序。通过继承这个抽象类,子类也继承了整个算法结构,并且可以选择重写父类的方法。
UML图如下
在上图中,我们定义了一个抽象类FileParser
,然后分别定义了两个子类CsvParser
和MarkdownParser
import fs from 'node:fs';
abstract class FileParser {
// 模板方法
parse(filePath: string) {
let content = this.readFile(filePath);
let fileData = this.parseFile(content);
this.processData(fileData);
}
readFile(filePath: string) {
if (fs.existsSync(filePath)) {
return fs.readFileSync(filePath, 'utf8');
}
}
// 抽象解析文件的方法,由不同子类实现
abstract parseFile(fileContent: string): any;
processData(fileData: any[]) {
console.log(fileData);
}
}
// 分别实现两个字类
class CsvParser extends FileParser {
parseFile(fileContent: string) {
return csvParse(fileContent);
}
}
class MarkdownParser extends FileParser {
parseFile(fileContent: string) {
return marked.parse(fileContent);
}
}
// 简化使用场景
const csvParser = new CsvParser();
csvParser.parse(path.join(__dirname, "Users.csv"));
const mdParser = new MarkdownParser();
mdParser.parse(path.join(__dirname, "Users.md"));
使用模板方法模式,我们实现了 CSV 和 Markdown 文件的解析。事实上,有了抽象类FileParser
,我们可以很容易地开发出不同的文件解析器。
最后总结一下模板方法模式的使用场景:
- 算法的整体步骤是非常固定的,但是当个别部分是可变的时,此时可以使用模板方法模式将易变的部分抽象出来,供子类实现。