O que são “decoradores” e como eles são usados?

Estou curioso para saber exatamente o que são os decoradores em AngularJS. Não há muita informação online para decoradores, exceto por uma sinopse na documentação do AngularJS e uma breve (embora interessante) menção em um vídeo do youtube .

Como os caras angulares colocaram como decorador é:

Decoração de serviço, permite ao decorador interceptar a criação da instância de serviço. A instância retornada pode ser a instância original ou uma nova instância que delega à instância original.

Eu realmente não sei o que isso significa , e não sei por que você separaria essa lógica do próprio serviço. Por exemplo, se eu quisesse retornar algo diferente sob condições diferentes, eu passaria argumentos diferentes para as funções relevantes ou usaria outra function compartilhando esse estado privado.

Eu ainda sou uma espécie de noob AngularJS então tenho certeza que é apenas ignorância e / ou maus hábitos que eu peguei.

Um bom caso de uso do $provide.decorator é quando você precisa fazer pequenos ajustes em algum serviço terceirizado / upstream, do qual seu módulo depende, deixando o serviço intacto (porque você não é o proprietário / mantenedor do serviço). serviço). Aqui está uma demonstração em plunkr.

Os decoradores nos permitem separar as preocupações transversais e permitir que os serviços preservem o princípio da responsabilidade única sem se preocupar com o código de “infraestrutura”.

Usos práticos de decoradores:

  • Armazenamento em cache: se tivermos um serviço que faça chamadas HTTP potencialmente caras, podemos agrupar o serviço em um decorador de armazenamento em cache que verifica o armazenamento local antes de fazer a chamada externa.
  • Depuração / Rastreio: possui um switch dependendo da sua configuração de desenvolvimento / produção que decora seus serviços com wrappers de debugging ou rastreamento.
  • Aceleração: envolva chamadas acionadas com freqüência em um wrapper de bloqueio. Nos permite interagir facilmente com serviços de taxa limitada, por exemplo.

Em todos esses casos, limitamos o código no serviço à sua responsabilidade principal.

decorator pode interceptar a instância de serviço criada por factory, service, value, provider e fornece as opções para alterar alguma instance(service) que, de outra forma, não é configurável / com opções.

Ele também pode fornecer instâncias de simulação para fins de teste, por exemplo, $http .

Em palavras simples, podemos dizer que é como um método de extensão. Por exemplo Nós temos uma class e tem dois methods e em tempo de execução queremos adicionar mais methods, então usamos Decorator.

Não podemos usar $ provide.decorator com constantes porque não podemos alterar as constantes que estão levantando a propriedade somente leitura.

Em suma decoradores podem ser descritos da seguinte forma: –

Uma function de decorador intercepta a criação de um serviço, permitindo replace ou modificar o comportamento do serviço.

Ele usa o serviço $provide por angular e modifica ou substitui a implementação de outro serviço

 $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; }]); 

Exemplo:

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

Aplicações

Além da resposta do @JBland.

  • Configurações de localidade ampla do aplicativo: –

    Você pode encontrar um exemplo aqui

  • Alterando o comportamento padrão e a implementação existente de um serviço pelo serviço angular:

    Você pode encontrar um eample aqui

  • Comportamento de comutação de uma function em diferentes ambientes.