Как создавать объекты с помощью шаблона декоратора?
У меня есть несколько вопросов относительно шаблона декоратора. Как я понял, шаблон декоратора существует для добавления поведения к объекту, т.е. «украшения объекта», чтобы вы могли составлять разные объекты без необходимости реализации большого количества разных классов с небольшими изменениями, что приводит к «взрыву класса». ".
Теперь дело в том, что обобщенный шаблон декоратора говорит, что у нас должен быть базовый класс, который затем расширяет наш класс декоратора, но также делегирует его. Таким образом, декоратор, по сути, и «является», и «имеет» базовый класс (а вместе с ним и его методы).
И здесь возникает проблема, потому что, скажем, я хочу создать «игрока» для игры, на самом деле много разных игроков и все с небольшими изменениями. Затем я мог бы захотеть использовать шаблон декоратора (?) и сказать: «Хорошо, наш базовый класс — обычный человек». Я хочу украсить этого человека пистолетом и бронежилетом. Тогда моя пушка класса декоратора будет реализовывать те же методы, что и у человека, скажем, «есть». Но, конечно же, мое ружье не будет есть, я хочу только, чтобы оно могло стрелять. И я могу исправить это, просто вернув null или что-то в этом роде, но это также нарушит принцип разделения интерфейса.
Итак, как бы я тогда решил это, не нарушая ISP, а также не создавая тонны классов с минимальными изменениями, например, «человек с ружьем», «человек с ружьем и бронежилетом», «человек с посохом и бронежилетом», "человек с посохом", вы поняли.
1 ответ
вам нужен "Композит", а не "Декоратор". Декораторы обычно используются для добавления к объектам сквозных функций, таких как ведение журнала, инструментирование, политики повторных попыток и т. д.
В вашем случае вместо этого вам нужен общий класс GameObject, содержащий коллекцию компонентов. Компонент — это то, что добавляет поведение объекту, например ИИ, статистику, физику и так далее.
Таким образом, вы можете избежать создания множества классов, таких как «Игрок», «Враг», «Босс», «Мегабосс» и так далее. Просто определите необходимые компоненты и добавьте их в GameObject, и все готово.