Я изучал шаблон декоратора как документировано в GOF .
Пожалуйста, помогите мне понять Шаблон Декоратора . Может ли кто-нибудь привести пример использования того, где это полезно в реальном мире?
decorator
design-patterns
odiseh
источник
источник
Ответы:
Рассмотрим случай пиццерии. В магазине пиццы они продадут несколько сортов пиццы, а также предоставят начинки в меню. А теперь представьте ситуацию, когда в магазине пиццы нужно указывать цены на каждую комбинацию пиццы и топпинга. Даже если есть четыре основные пиццы и 8 различных начинок, приложение сойдет с ума, поддерживая все эти конкретные комбинации пиццы и начинок.
Вот идет образец декоратора.
В соответствии с шаблоном декоратора, вы будете реализовывать начинки, так как декораторы будут украшать пиццы. Практически каждый клиент захочет получить начинки по своему желанию, а окончательная сумма счета будет состоять из базовой пиццы и дополнительно заказанной начинки. Каждый топ-декоратор будет знать о пицце, которую он украшает, и о ее цене. Метод GetPrice () объекта Topping возвращает совокупную цену как пиццы, так и начинки.
РЕДАКТИРОВАТЬ
Вот пример кода объяснения выше.
источник
Это простой пример динамического добавления нового поведения к существующему объекту или шаблону Decorator. Из-за природы динамических языков, таких как Javascript, этот шаблон становится частью самого языка.
источник
switch
или простоif
, вы могли бы утверждать, что это отличный пример динамического добавления поведения в класс. НО, нам нужно как минимум два класса, чтобы определить декоратор и декорированные объекты в этом шаблоне.Стоит отметить, что модель ввода-вывода Java основана на шаблоне декоратора. Слой этого читателя поверх этого читателя поверх ... - это действительно реальный пример декоратора.
источник
Пример - Сценарий. Допустим, вы пишете модуль шифрования. Это шифрование может зашифровать чистый файл, используя DES - стандарт шифрования данных. Аналогично, в системе вы можете использовать шифрование как стандарт шифрования AES - Advance. Также у вас может быть комбинация шифрования - сначала DES, затем AES. Или вы можете иметь сначала AES, потом DES.
Обсуждение - Как вы будете обслуживать эту ситуацию? Вы не можете продолжать создавать объект таких комбинаций - например - AES и DES - всего 4 комбинации. Таким образом, вам нужно иметь 4 отдельных объекта. Это будет усложняться по мере увеличения типа шифрования.
Решение - Продолжайте наращивать стек - комбинации в зависимости от необходимости - во время выполнения. Еще одно преимущество этого стекового подхода заключается в том, что вы можете легко его раскрутить.
Вот решение - в C ++.
Во-первых, вам нужен базовый класс - фундаментальная единица стека. Вы можете думать как основа стека. В этом примере это чистый файл. Будем всегда следовать полиморфизму. Сделайте сначала интерфейсный класс этой фундаментальной единицы. Таким образом, вы можете реализовать это как хотите. Кроме того, вам не нужно думать о зависимости при включении этого фундаментального модуля.
Вот класс интерфейса -
Теперь реализуйте этот интерфейсный класс -
Теперь давайте создадим абстрактный класс декоратора - который может быть расширен для создания любых разновидностей - здесь это разновидность шифрования. Этот абстрактный класс декоратора относится к базовому классу. Таким образом, декоратор "является" своего рода интерфейсным классом. Таким образом, вам нужно использовать наследование.
Теперь давайте создадим класс конкретного декоратора - Тип шифрования - AES -
Теперь предположим, что тип декоратора - DES
const std :: string desEncrypt = "DES Encrypted";
Давайте создадим клиентский код для использования этого класса декоратора -
Вы увидите следующие результаты -
Вот диаграмма UML - Классовое представление этого. В случае, если вы хотите пропустить код и сосредоточиться на аспекте дизайна.
источник
strategy pattern
?Шаблон Decorator поможет вам изменить или настроить функциональность вашего объекта, связав его с другими подобными подклассами этого объекта.
Лучший пример - классы InputStream и OutputStream в пакете java.io
источник
Что такое шаблон оформления декоратора в Java.
Формальное определение шаблона Decorator из книги GoF (Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения, 1995, Pearson Education, Inc. Publishing as Pearson Addison Wesley) говорит, что вы можете,
«Прикрепите дополнительные обязанности к объекту динамически. Декораторы предоставляют гибкую альтернативу подклассам для расширения функциональности».
Допустим, у нас есть пицца, и мы хотим украсить ее такими начинками, как куриный масала, лук и сыр моцарелла. Давайте посмотрим, как реализовать это в Java ...
Программа для демонстрации того, как реализовать Pattern Design Decorator в Java.
Pizza.java:
источник
Я широко использовал шаблон Decorator в своей работе. Я сделал пост в своем блоге о том, как использовать его с ведением журнала.
источник
Давайте рассмотрим пример, в котором вам нужно создать приложение, которое рассчитывает цену различных видов гамбургеров. Вам нужно обрабатывать разные вариации гамбургеров, например, «большой» или «с сыром», каждый из которых имеет цену относительно основного гамбургера. Например, добавьте 10 долларов за бургер с сыром, добавьте 15 долларов за большой бургер и т. Д.
В этом случае у вас может возникнуть соблазн создать подклассы для их обработки. Мы можем выразить это в Ruby как:
В приведенном выше примере класс BurgerWithCheese наследуется от Burger и переопределяет метод цены, добавляя $ 15 к цене, определенной в суперклассе. Вы также создадите класс LargeBurger и определите цену относительно Burger. Но вам также нужно определить новый класс для комбинации «большой» и «с сыром».
Теперь, что произойдет, если нам нужно подать "гамбургер с картошкой фри"? У нас уже есть 4 класса для обработки этих комбинаций, и нам нужно будет добавить еще 4 для обработки всех комбинаций из 3 свойств - «большой», «с сыром» и «с картофелем фри». Нам нужно 8 классов сейчас. Добавьте другое свойство, и нам понадобится 16. Это будет расти как 2 ^ n.
Вместо этого давайте попробуем определить BurgerDecorator, который принимает объект Burger:
В приведенном выше примере мы создали класс BurgerDecorator, от которого наследуется класс BurgerWithCheese. Мы также можем представить «большой» вариант, создав класс LargeBurger. Теперь мы можем определить большой бургер с сыром во время выполнения как:
Помните, как использование наследования для добавления варианта «с картофелем фри» включало бы добавление еще 4 подклассов? С помощью декораторов мы просто создали бы один новый класс, BurgerWithFries, для обработки нового варианта и обработки его во время выполнения. Каждое новое свойство должно было бы просто больше декоратора, чтобы покрыть все перестановки.
PS. Это краткая версия статьи об использовании шаблона Decorator в Ruby , которую я написал , которую вы можете прочитать, если хотите найти более подробные примеры.
источник
Decorator:
Обратитесь к источникам статье для более подробной информации.
Декоратор (Аннотация) : это абстрактный класс / интерфейс, который реализует интерфейс компонента. Содержит интерфейс компонента. В отсутствие этого класса вам нужно много подклассов ConcreteDecorator для разных комбинаций. Композиция компонента уменьшает ненужные подклассы.
Пример JDK:
Посмотрите на вопрос SE ниже для UML-диаграммы и примеров кода.
Декоратор Pattern для IO
Полезные статьи:
journaldev
википедия
Пример настоящего слова шаблона Decorator: VendingMachineDecorator @
Когда использовать шаблон декоратора?
В приведенном выше примере чай или кофе (напиток) украшены сахаром и лимоном.
источник
Шаблон декоратора достигает единственной цели - динамически добавлять обязанности к любому объекту .
Модель ввода / вывода Java основана на шаблоне декоратора.
источник
В Википедии есть пример оформления окна с помощью полосы прокрутки:
http://en.wikipedia.org/wiki/Decorator_pattern
Вот еще один «реальный мир» пример «члена команды, руководителя и менеджера», который показывает, что шаблон декоратора незаменим при простом наследовании:
https://zishanbilal.wordpress.com/2011/04/28/design-patterns-by-examples-decorator-pattern/
источник
Некоторое время назад я реорганизовал кодовую базу в использование шаблона Decorator, поэтому я попытаюсь объяснить пример использования.
Предположим, у нас есть набор сервисов, и в зависимости от того, приобрел ли пользователь лицензию на конкретный сервис, нам нужно запустить сервис.
Все сервисы имеют общий интерфейс
Предварительный рефакторинг
Если вы внимательно наблюдаете,
ServiceSupport
зависит отLicenseManager
. Но почему это должно зависеть отLicenseManager
? Что, если нам нужен фоновый сервис, который не должен проверять информацию о лицензии. В сложившейся ситуации нам придется как-то тренироваться,LicenseManager
чтобы вернутьсяtrue
за справочными услугами. Этот подход мне не показался удачным. По моему мнению проверка лицензии и другая логика были ортогональны друг другу.Так на помощь приходит Decorator Pattern и здесь начинается рефакторинг с TDD.
Постфакторинг
Takeaways
источник
Давайте возьмем пример PubG. Штурмовые винтовки лучше всего работают с 4-кратным зумом, и пока мы на нем, нам также понадобятся компенсатор и подавитель. Это уменьшит отдачу и уменьшит звук стрельбы, а также эхо. Нам нужно будет реализовать эту функцию, где мы позволим игрокам покупать их любимые ружья и аксессуары. Игроки могут купить пистолет или часть аксессуара или весь аксессуар, и с них будет взиматься соответствующая плата.
Давайте посмотрим, как шаблон декоратора применяется здесь:
Предположим, кто-то хочет купить SCAR-L со всеми тремя аксессуарами, упомянутыми выше.
Это приведет к такой диаграмме классов:
Теперь у нас могут быть такие классы:
Мы также можем добавить другие аксессуары и украсить наш пистолет.
Ссылка:
https://nulpointerexception.com/2019/05/05/a-beginner-guide-to-decorator-pattern/
источник
Шаблон Design Decorator : этот шаблон помогает изменять характеристики объекта во время выполнения. Он обеспечивает объектам различные вкусы и дает возможность выбирать, какие ингредиенты мы хотим использовать в этом вкусе.
Пример из реальной жизни: допустим, у вас есть основное место в салоне самолета. Теперь вам разрешено выбирать несколько удобств с места. Каждое удобство имеет свою цену, связанную с этим. Теперь, если пользователь выбирает Wi-Fi и премиум-питание, с него / нее взимается плата за место + Wi-Fi + премиум-питание.
В этом случае дизайн шаблона декоратора действительно может нам помочь. Посетите приведенную выше ссылку, чтобы узнать больше о шаблоне декоратора и реализации одного реального примера.
источник