代理和装饰器之间的界限
在本书的这一点上,您可能对代理模式和装饰器模式之间的差异有一些合理的怀疑。 这两种模式确实非常相似,有时可以互换使用。
在其经典体现中,装饰器模式被定义为一种允许我们使用新行为增强现有对象的机制,而代理模式则用于控制对具体或虚拟对象的访问。
这两种模式之间存在概念上的差异,这主要取决于它们在运行时的使用方式。
您可以将装饰器模式视为包装器; 您可以采用不同类型的对象并决定用装饰器包装它们,以通过额外的功能来增强它们的功能。 相反,代理用于控制对对象的访问,并且不会改变原始接口。 因此,一旦创建了代理实例,就可以将其传递到需要原始对象的上下文。
在实现方面,这些差异通常在强类型语言中更加明显,在强类型语言中,您传递的对象的类型是在编译时检查的。 在 Node.js 生态系统中,考虑到 JavaScript 语言的动态特性,代理模式和装饰器模式之间的界限相当模糊,并且这两个名称通常可以互换使用。 我们还看到了如何使用相同的技术来实现这两种模式。
在处理 JavaScript 和 Node.js 时,我们的建议是避免陷入这两种模式的术语和规范定义的泥潭。 我们鼓励您从整体上看待代理和装饰器解决的问题类别,并将这两种模式视为互补且有时可互换的工具。