[БЕЗ_ЗВУКА] [БЕЗ_ЗВУКА] В данном видео мы рассмотрим такой паттерн проектирования, как Decorator. Decorator — это один из самых простых и одновременно часто встречающихся паттернов проектирования. По классификации, о которой было рассказано в предыдущем видео, этот паттерн относится к классу структурных. Определим его задачу. Пусть для некоторого множества задач определен класс, объекты которого эту задачу могут решать. И пусть для некоторых из объектов требуется дополнительная функциональность помимо той, которая была в оригинальном классе. Это большая проблема. Классическим решением этой проблемы было бы создание подкласса, в котором реализована необходимая функциональность. Но что, если заранее неизвестно, какая функциональность или какие свойства нужны объекту? Можно попытаться реализовать классы-потомки со всеми возможными комбинациями свойств, которые могут быть. Но если возможных функциональных свойств действительно очень много? Тогда количество их комбинаций возрастает экспоненциально. Decorator позволяет красиво решить проблему реализации дополнительной функциональности. Разберемся, как он работает. Рассмотрим класс Pizza. Это очень хороший пример, так как в ассортименте любой пиццерии есть огромное количество различных сортов пиццы. Определимся для начала со свойствами. У каждой пиццы есть размер, набор ингредиентов и стоимость. Определим абстрактный базовый класс Pizza. У него будут методы «посчитать стоимость», «узнать ингредиенты» и «посмотреть размер». Чем больше пицца или чем больше ингредиентов в ней, тем больше ее стоимость. Определим реализацию этого класса, margarita. Она состоит только из теста, томатной пасты и сыра. Все остальные пиццы являются лишь ее улучшениями. Теперь давайте определим абстрактный класс Decorator, в который объявим конструктор, принимающий на вход пиццу. Именно наследники вот этого abstract decorator и будут изменять нашу «Маргариту», делая ее вкуснее и питательнее. Определимся с ингредиентами. У нас это будет мясо, помидоры, перец и оливки. Также каждая пицца может быть в трех размерах: большом, среднем и маленьком. А теперь давайте приготовим пиццу нашей мечты, попутно разобравшись с устройством классов-наследников нашего Decorator. Пусть ваша пицца уже частично готова, и на данном шаге вам нужно добавить в нее мясо. Таким образом, список ингредиентов пиццы будет пополнен этим мясом, а стоимость пиццы возрастет на стоимость мяса, при этом размер пиццы не изменяется. И нам абсолютно неважно, какие ингредиенты уже были в пицце до того, как мы добавили в нее мясо. Добавим теперь еще одно свойство, размер. Изменение размера приводит к изменению соответствующего свойства пиццы, а также к добавлению мультипликатора к ее стоимости. Размер также является декоратором класса Pizza. Полная диаграмма классов для этого примера сейчас находится справа от меня. Подведем итоги. Использование паттерна Decorator позволяет динамически добавлять некоторому объекту функциональность, которой у него до этого не было. Реализуется данный паттерн путем создания абстрактного базового класса, абстрактного Decorator для этого класса и их наследников, базовых классов и базовых Decorator. Применение Decorator к объекту заключается в оборачивании нашего объекта в некоторый Decorator с дополнительной функциональностью. К одному объекту может быть применено произвольное число декораторов. В следующем видео мы разберемся, как данный паттерн можно реализовать с использованием языка программирования Python. [БЕЗ_ЗВУКА]