InfoQ|你应该了解的5种TypeScript设计模式

作者 | Fernando Doglio 译者 | 王强 策划 | 蔡芳芳
【InfoQ|你应该了解的5种TypeScript设计模式】本文最初发布于 Medium 网站 , 经原作者授权由 InfoQ 中文站翻译并分享 。
设计模式是解决问题的良好模板 , 开发人员可以在自己的项目应用这些模式处理需求 。 现实中应付各种需求的模式数不胜数 , 一篇文章无法尽述 。 不过它们可以大致分为三个类别:

  • 结构模式 , 负责处理不同组件(或类)之间的关系 , 并形成新结构以提供新功能 。 结构模式的例子有组合(Composite)、适配器(Adapter)和装饰器(Decorator) 。
  • 行为模式 , 它们能将组件之间的通用行为抽象为一个单独的实体 , 进而与你的创建模式结合起来 。 行为模式的例子包括命令(Command)、策略(Strategy)以及我个人最喜欢的一种:观察者(Observer)模式 。
  • 创建模式 , 它们专注于类的实例化 , 简化新实体的创建过程 , 例如工厂(Factory)方法、单例(Singleton)和抽象工厂(Abstract Factory) 。
虽然它们可以直接在 JavaScript 中实现 , 特别是有了 ES6 后实现起来更容易了 , 但 TypeScript 采用的 OOP 方法使得开发人员可以简单明了地遵循通用指南(甚至来自其他 OOP 语言) , 从而获得这些模式的所有好处(而标准 JS 相比之下多少存在一些限制) 。
单例 单例模式可能是最著名的设计模式之一 。 这是一种创建模式 , 它可以确保无论你多少次实例化一个类 , 你都只会有一个实例 。
这是处理数据库连接之类场景的好方法 , 因为你可能希望一次只处理一个连接 , 而不必在每次用户请求时都重新连接 。
//Simulate a database connectino class class MyDBConn{ protected static instance: MyDBConn | null = null private id: number = 0 constructor { //... db connection logic this.id = Math.random //the ID could represent the actual connection to the db } public getID: number { return this.id } public static getInstance: MyDBConn { if(!MyDBConn.instance) { MyDBConn.instance = new MyDBConn } return MyDBConn.instance } } const connections = [ MyDBConn.getInstance, MyDBConn.getInstance ] connections.forEach( c => { console.log(c.getID) 现在你不能直接实例化这个类 , 但使用 getInstance 方法时 , 你可以确保不会有多个实例 。 在上面的示例中 , 你可以看到包装数据库连接的伪类是怎样从这一模式中受益的 。 很容易将 id 属性视为实际连接 , 而这个小测试向你展示了 , 无论你调用 getInstance 方法多少次 , “连接”总是相同的 。 代码的输出是:
0.4047087250990713 0.4047087250990713 0.4047087250990713 0.4047087250990713 0.4047087250990713工厂方法 如前所述 , 工厂方法像单例一样也是一种创建模式 。 但这种模式不是直接针对我们要创建的对象 , 而只管理它们的创建过程 。
解释一下:假设你要编写移动一些交通工具的代码 , 它们的类型有很大区别(例如汽车、自行车和飞机) , 移动代码应封装在每个交通工具类中 , 但调用这些 move 代码的方法可以是通用的 。
这里的问题是如何处理对象创建?你可能有一个具有 3 个方法的 creator 类 , 或者一个接收一个参数的方法 。 无论哪种情况 , 要扩展这种逻辑以支持创建更多交通工具 , 都需要你修改同一个类 。


推荐阅读