什么是“装饰器”,如何使用它们?

我很好奇AngularJS中的装饰器到底是什么。除了AngularJS文档中的简介和YouTube视频中的简短(尽管有趣)提及之外,网上没有太多关于装饰者的信息。

正如Angular的家伙所说,装饰者是:

服务的装饰,允许装饰器拦截服务实例的创建。返回的实例可以是原始实例,也可以是委托给原始实例的新实例。

我真的不知道这意味着什么,我也不确定为什么你会把这个逻辑与服务本身分开。例如,如果我想在不同的条件下返回不同的东西,我会将不同的参数传递给相关函数,或者使用另一个共享该私有状态的函数。

我仍然有点像AngularJS新手,所以我确信这只是我养成的无知和/或坏习惯。


答案 1

一个很好的用例是,当您需要对模块所依赖的某些第三方/上游服务进行微小的“调整”时,同时保持服务不变(因为您不是服务的所有者/维护者)。这是关于plunkr的演示。$provide.decorator


答案 2

装饰器允许我们分离出跨领域问题,并允许服务保留单一责任原则,而不必担心“基础架构”代码。

装饰器的实际用途:

  • 缓存:如果我们有一个进行潜在昂贵HTTP调用的服务,我们可以将服务包装在缓存装饰器中,该装饰器在进行外部调用之前检查本地存储。
  • 调试/跟踪:根据开发/生产配置使用调试或跟踪包装器装饰服务的开关。
  • 限制 :将频繁触发的调用包装在去抖动包装器中。例如,允许我们轻松地与受速率限制的服务进行交互。

在所有这些情况下,我们将服务中的代码限制在其主要职责范围内。