设计模式:(Template Method Pattern)模板方法模式

76 阅读2分钟

欢迎来到 TypeScript 中的设计模式系列,它介绍了使用TypeScript进行Web开发的一些有用的设计模式。

系列文章如下:

设计模式对 Web 开发人员来说非常重要,我们可以通过掌握它们来编写更好的代码。在本文中,我将使用TypeScript来介绍责任链模式

模板方法模式由两部分组成:抽象父类和具体实现子类。通常,子类的算法实现封装在抽象父类中,还包括一些公共方法以及封装的子类中所有方法的执行顺序。通过继承这个抽象类,子类也继承了整个算法结构,并且可以选择重写父类的方法。

UML图如下

image.png

在上图中,我们定义了一个抽象类FileParser,然后分别定义了两个子类CsvParserMarkdownParser

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,我们可以很容易地开发出不同的文件解析器。

最后总结一下模板方法模式的使用场景:

  • 算法的整体步骤是非常固定的,但是当个别部分是可变的时,此时可以使用模板方法模式将易变的部分抽象出来,供子类实现。