Что такое "декораторы" и как они используются?

Мне любопытно, что именно декораторы в AngularJS. Существует не так много информации в Интернете для декораторов, за исключением рекламы в документации AngularJS и краткого (хотя и интересного) упоминания в видео youtube.

Как ребята Angular, ребята, это декоратор:

Украшение сервиса, позволяет декоратору перехватывать услугу создание экземпляра. Возвращенным экземпляром может быть исходный экземпляр, или новый экземпляр, который делегирует исходный экземпляр.

Я действительно не знаю, что это значит, и я не уверен, почему вы отделите эту логику от самой службы. Например, если бы я хотел вернуть что-то другое в разных условиях, я просто передал бы разные аргументы соответствующим функциям или использовал бы другую функцию, разделяющую это частное состояние.

Я все еще вроде AngularJS noob, поэтому я уверен, что это просто невежество и/или вредные привычки, которые я выбрал.

Ответ 1

Хорошим вариантом использования $provide.decorator является то, когда вам нужно выполнить незначительную "настройку" на какой-либо сторонней/восходящей службе, от которой зависит ваш модуль, оставив службу неповрежденной (поскольку вы не являетесь владельцем/сопровождающим услуги). Здесь - демонстрация на plunkr.

Ответ 2

Декораторы позволяют нам выделять сквозные проблемы и предоставлять услуги для сохранения SRP, не беспокоясь о "инфраструктурном" коде.

Практическое использование декораторов:

  • Кэширование: если у нас есть служба, которая делает потенциально дорогостоящие HTTP-вызовы, мы можем обернуть службу в декодер кеширования, который проверяет локальное хранилище перед выполнением внешнего вызова.
  • Отладка/трассировка: есть переключатель в зависимости от вашей конфигурации разработки/производства, которая украшает ваши сервисы с помощью отладочных или трассировочных оберток.
  • Дросселирование: обматывание часто вызываемых вызовов в обертки debouncing. Позволяет нам легко взаимодействовать с услугами с ограничением скорости, например.

Во всех этих случаях мы ограничиваем код в сервисе своей основной ответственностью.

Ответ 3

decorator может перехватить экземпляр службы, созданный с помощью factory, service, value, provider, и дает возможность изменять некоторые instance(service), которые иначе не настраиваются/с параметрами.

Он также может предоставлять макеты для целей тестирования, например $http.

Ответ 4

В простом слове мы можем сказать, что это как метод расширения. Для примера. У нас есть класс, и у него есть два метода, и во время выполнения мы хотим добавить в него больше методов, тогда мы используем Decorator.

Мы не можем использовать $reserve.decorator с константами, потому что мы не можем изменить константы, которые они используют только для чтения.