Подтвердить что ты не робот

Является ли AOP типом декоратора?

Мне задали этот вопрос в интервью. Я четко знаю, что такое узор декоратора и как его можно использовать. Но я не смог продумать этот вопрос в интервью.

Это актуальный вопрос.

Является ли AOP изменением шаблона декоратора? Как реализация АОП отличается от шаблона декоратора торговой марки?

4b9b3361

Ответ 1

Я бы сказал, AOP (Аспектно-ориентированное программирование) не является шаблоном сам по себе (и, следовательно, не является типом рисунка декоратора из моего POV)... его реализация может быть сделано с помощью одного или нескольких шаблонов (включая использование рисунка декоратора)... AOP - парадигма программирования IMHO - другие парадигмы - это, например, ООП, функциональное программирование или процедурное программирование...

Ответ 2

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

Ответ 3

Я бы сказал, да, AOP - это реализация шаблона декоратора.

Для меня самые большие различия были в том, как он реализован и как он применяется.

Традиционные декораторы обычно представляют собой объекты, которые либо объединяют объект, который оформляется явно, либо активируются точкой расширения базового объекта.

AOP обычно указывается более "декларативным" способом - традиционные декораторы являются общей частью кода основной линии.

Традиционные декораторы обычно применимы только к определенным классам или интерфейсам и обычно применяются на уровне экземпляра. АОП (в общем) может обернуть функциональность вокруг практически произвольного кода на "уровне земли" - поведение будет распространяться на все экземпляры того, к чему применяется этот аспект. Это то, что позволяет ему удовлетворять свои требования о "сквозной функциональности": это не обязательно ограничивается узкой областью, как декораторы.

Это зависит от основного языка, однако - некоторые из них более гибкие, чем другие. Вышеизложенное относится больше к "статическим" языкам (например, Java) и не столько к языку, как Ruby, где то, что выглядит как традиционный декоратор, может быть применено к одному экземпляру или стать частью определения класса.

Ответ 4

Кроме того, каркасы инъекций зависимостей, которые поддерживают перехват для сквозных проблем, в основном применяют узор декоратора под капотом. Рамки, которые переносят аспекты на промежуточный язык (как в .Net MSIL), не зависят от интерфейсов или наследования, в отличие от шаблона декоратора.