什么是“装饰者”以及它们是如何使用的?

时间:2013-04-18 06:29:47

标签: javascript angularjs decorator angularjs-decorator

我很好奇AngularJS中究竟是什么装饰者。除了AngularJS documentation中的模糊信息和youtube video中的简短(尽管有趣)提及之外,还没有很多关于装饰者的在线信息。

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

  

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

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

我仍然是一个AngularJS菜鸟,所以我确定它只是无知和/或我已经习惯的坏习惯。

5 个答案:

答案 0 :(得分:216)

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

答案 1 :(得分:66)

装饰者允许我们将跨领域的问题分开,并允许服务保留单一责任原则,而不必担心“基础设施”代码。

装饰者的实际用途:

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

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

答案 2 :(得分:10)

decorator可以截取factory, service, value, provider创建的服务实例,并提供更改某些instance(service)的选项,否则这些选项无法配置/选项。

它还可以提供用于测试目的的模拟实例,例如$http

答案 3 :(得分:3)

简单来说,我们可以说它就像一个扩展方法。对于Ex。我们有一个类,它有两个方法,在运行时我们想在其中添加更多方法然后我们使用Decorator。

我们不能将$ provide.decorator与常量一起使用,因为我们无法更改它们只读属性的常量。

答案 4 :(得分:1)

简而言之,装饰者可以描述如下: -

  

装饰器功能拦截服务的创建,允许它   覆盖或修改服务的行为。

它通过角度使用$provide服务并修改或替换另一个服务的实现

$provide.decorator('service to decorate',['$delegate', function($delegate) {
  // $delegate - The original service instance, 
  //             which can be replaced, monkey patched, 
  //             configured, decorated or delegated to. 
  //             ie here what is there in the 'service to decorate'

  //   This function will be invoked, 
  //   when the service needs to be provided 
  //   and should return the decorated service instance.
  return $delegate;
}]);

示例:

$provide.decorator('$log', ['$delegate', function($delegate) {
  // This will change implementation of log.war to log.error
  $delegate.warn = $delegate.error; 
  return $delegate;
}]);

应用程序

除了@JBland回答。

  • 应用程序范围的区域设置: -

    您可以找到示例here

  • 通过角度服务实现服务的默认行为和现有实现: -

    您可以找到例子here

  • 在不同环境中切换功能的行为。