Мне задали этот вопрос в интервью. Я четко знаю, что такое паттерн-декоратор и как его можно использовать. Но в интервью мне не удалось обдумать этот вопрос.
Это и есть актуальный вопрос.
Является ли АОП разновидностью шаблона декоратора? Чем реализация АОП отличается от шаблона декоратора товарного знака?
Я бы сказал, AOP (Аспектно-ориентированное программирование) НЕ является шаблоном сам по себе (и, следовательно, не является типом шаблона декоратора из моего POV) ... его реализация может быть выполнена с помощью одного или нескольких шаблонов. (включая использование шаблона декоратора ) ... AOP - это парадигма программирования ИМХО - другие парадигмы, например, ООП, функциональное программирование или процедурное программирование ...
Я согласен с Яхией в целом. Обратите внимание, что, хотя аспекты добавляют и, возможно, модифицируют существующую функциональность, они обычно применяются к целым методам или классам, а не к отдельным экземплярам.
Я бы сказал, да, AOP - это реализация шаблона декоратора.
Для меня самые большие различия были бы в том, как это реализовано, и как это применяется.
Традиционные декораторы, как правило, представляют собой объекты, которые либо создают явно декорируемый объект, либо включаются точкой расширения базового объекта.
AOP обычно указывается более «декларативным» образом - традиционные декораторы являются общей частью основного кода.
Традиционные декораторы обычно применимы только к конкретным классам или интерфейсам и обычно применяются на уровне экземпляров. АОП (в целом) может обернуть функциональность вокруг по существу произвольного кода на «уровне земли» - поведение будет распространяться на все экземпляры любого аспекта, к которому применяется аспект. Это то, что позволяет ему удовлетворить свое требование «сквозной функциональности»: оно не обязательно ограничено такой же узкой областью, как декораторы.
Это зависит от основного языка, однако - некоторые из них более гибкие, чем другие. Вышеприведенное относится в большей степени к «статическим» языкам (например, Java), а не к языку, подобному Ruby, где то, что выглядит как традиционный декоратор, может быть применено к одному экземпляру или стать частью определения класса.