Доброго времени суток. Сегодня у нас на очереди очень интересный паттерн – декоратор. В этой статье мы научимся наделять классы новыми возможностями во время выполнения без лишнего наследования. Декоратор – это структурный паттерн. Такие паттерны отвечают за построение удобных в поддержке и иерархии классов. Декоратор динамически наделяет класс новыми возможностями и является альтернативой множеству подклассов. Некий клиенсткий од обращается к IDataProvider, чтобы записать или вывести данные. IDAtaProvider- это интерфейс или абстрактный класс. Т.е клиент работает по заданному контарту. FileReader – это простая реализация чтения и записи в файл, которая условно лежит под капотом абстракции IDataProvider. Если бы мы пользовались паттерном стратегия, то получилась бы примерно такая структура. На выходе мы получаем несколько классов для работы с файлом и сжатием, с файлом и расшифрованием. Но что, если нам такое не подходит, зачем дублировать один и тот же код. Но мы можем сделать следующ