Я читал статью по программированию, в которой упоминался шаблон Decorator. Я программировал некоторое время, но без какого-либо формального образования или обучения, но я пытаюсь узнать о стандартных шаблонах и тому подобном.
Поэтому я посмотрел Декоратор и нашел статью в Википедии . Теперь я понимаю концепцию шаблона Decorator, но меня немного смутил этот отрывок:
В качестве примера рассмотрим окно в оконной системе. Чтобы разрешить прокрутку содержимого окна, мы можем добавить к нему горизонтальные или вертикальные полосы прокрутки, в зависимости от ситуации. Предположим, что окна представлены экземплярами класса Window, и предположим, что этот класс не имеет функций для добавления полос прокрутки. Мы могли бы создать подкласс ScrollingWindow, который их предоставляет, или мы могли бы создать ScrollingWindowDecorator, который добавляет эту функциональность к существующим объектам Window. На данный момент, любое решение будет в порядке.
Теперь давайте предположим, что мы также хотим добавить возможность добавить границы в наши окна. Опять же, наш оригинальный класс Window не имеет поддержки. Подкласс ScrollingWindow теперь создает проблему, потому что он эффективно создал окно нового типа. Если мы хотим добавить поддержку границ для всех окон, мы должны создать подклассы WindowWithBorder и ScrollingWindowWithBorder. Очевидно, что эта проблема усугубляется с каждой добавляемой новой функцией. Для решения для декоратора мы просто создаем новый BorderedWindowDecorator - во время выполнения мы можем декорировать существующие окна с помощью ScrollingWindowDecorator или BorderedWindowDecorator или обоих, как мы сочтем нужным.
Хорошо, когда говорят добавить границы ко всем окнам, почему бы просто не добавить функциональность в исходный класс Window, чтобы разрешить эту опцию? На мой взгляд, подклассы предназначены только для добавления определенных функций в класс или переопределения метода класса. Если бы мне нужно было добавить функциональность ко всем существующим объектам, почему бы мне просто не изменить суперкласс для этого?
В статье была еще одна строка:
Шаблон декоратора является альтернативой подклассам. Подклассы добавляют поведение во время компиляции, и изменение влияет на все экземпляры исходного класса; Декорирование может обеспечить новое поведение во время выполнения для отдельных объектов.
Я не понимаю, где они говорят «... изменение влияет на все экземпляры исходного класса» - как подклассы изменяют родительский класс? Разве это не весь смысл подкласса?
Я собираюсь предположить, что статья, как и многие вики, просто не написана четко. Я вижу полезность Декоратора в последней строке - «... обеспечить новое поведение во время выполнения для отдельных объектов».
Не читая об этом шаблоне, если бы мне нужно было изменить поведение во время выполнения для отдельных объектов, я бы, вероятно, встроил некоторые методы в супер- или подкласс для включения / отключения указанного поведения. Пожалуйста, помогите мне действительно понять полезность Декоратора, и почему мое мышление новичка неверно?