InfoQ你应该了解的5种TypeScript设计模式
作者 | Fernando Doglio 译者 | 王强 策划 | 蔡芳芳
本文最初发布于 Medium 网站 , 经原作者授权由 InfoQ 中文站翻译并分享 。
设计模式是解决问题的良好模板 , 开发人员可以在自己的项目应用这些模式处理需求 。 现实中应付各种需求的模式数不胜数 , 一篇文章无法尽述 。 不过它们可以大致分为三个类别:
- 结构模式 , 负责处理不同组件(或类)之间的关系 , 并形成新结构以提供新功能 。 结构模式的例子有组合(Composite)、适配器(Adapter)和装饰器(Decorator) 。
- 行为模式 , 它们能将组件之间的通用行为抽象为一个单独的实体 , 进而与你的创建模式结合起来 。 行为模式的例子包括命令(Command)、策略(Strategy)以及我个人最喜欢的一种:观察者(Observer)模式 。
- 创建模式 , 它们专注于类的实例化 , 简化新实体的创建过程 , 例如工厂(Factory)方法、单例(Singleton)和抽象工厂(Abstract Factory) 。
单例 单例模式可能是最著名的设计模式之一 。 这是一种创建模式 , 它可以确保无论你多少次实例化一个类 , 你都只会有一个实例 。
这是处理数据库连接之类场景的好方法 , 因为你可能希望一次只处理一个连接 , 而不必在每次用户请求时都重新连接 。
//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 类 , 或者一个接收一个参数的方法 。 无论哪种情况 , 要扩展这种逻辑以支持创建更多交通工具 , 都需要你修改同一个类 。
- 吃货|快餐酸菜鱼加盟流程:了解完品牌后,最后还要经过培训
- 没蜡笔的小新|“整容脸”应该被鄙视吗?医生告诉你千篇一律的好看皮囊如何而来
- TopGame|FIFA足球世界 氪金游戏平民如何生存?最详白嫖套路了解下
- 刺刀|CSGO皮肤指南:刺刀应该怎么挑选?这款比穷人之水还便宜
- 王者荣耀|碎片商店免费换皮肤真香?大仙意外曝光5条规律,了解后赚大了!
- 【】詹眉又比肩OK组合纪录 沃帅:戴维斯才应该是DPOY
- 「浪姐」浪姐成团:30+的女性应该活成什么样子?她们给出了最好的答案
- 时尚广州|T恤的标语你了解过吗?揭秘衣服上那些奇怪的字句
- 央视新闻|毁草罚种草,网友觉得“还不够”,应该……
- 星城古龙|勒夫被喊下课,德国欧国联两连平,应该想念诺伊尔了吧?