Извините за давние примеры, но недавно я столкнулся с проблемой такого типа программного обеспечения и думал об этом. Не уверен, есть ли для этого термин, поэтому я дам два общих примера, чтобы дать представление:Какие шаблоны проектирования могут помочь моделировать объекты, поведение которых меняется динамически или объекты со многими необязательными поведением?
Пример 1: Вы работаете над игрой RPG, и у вас есть класс для главного героя. Реакция этого персонажа на игровой мир меняется в зависимости от того, на что вы надеваете/держите, выделенные навыки, в основном внутреннее состояние вашего объекта.
Скажет у вас есть следующие пункты в игре:
- Кольца регенерации: позволяешь вашему персонажу восстанавливать здоровье с течением времени
- подлых кроссовок: увеличение прокрасться
- Волшебного зеркала: отражает% поступающий повреждение
- Doofy очки: основные крафта ресурсы
Пример 2: У вас есть Toyota Corolla. Есть разные конфигурации, но все они Toyota Corollas. ABS и Traction Control являются дополнительными функциями (поведением), которые вы можете добавить к базовой модели.
- Базовая модель ничего не делает при запуске.
- с ABS, проверки автомобиля и реагирует на внезапные остановки, когда автомобиль бежит
- С контроля тяги, проверки автомобиля и реагирует на потерю тяги, когда автомобиль бежит
- И, очевидно, когда у вас есть автомобиль с оба, вы будете делать оба поведения, когда машина работает.
Общие свойства двух примеров:
- класс значение имеет конкретный чистый лист, что он может начать с
- дополнительные элементы/части могут добавить способность или дополнительное поведение к этому объекту; что-то дополнительно, чтобы сделать в игру клещ/во время работы
- может или не может мутировать объект, когда элемент/поведение добавляется или снимается из него (инкремента предварительного просмотра фильма, когда надевая кроссовки, уменьшить его, принимая его)
Потенциальные решения (но не адекватные):
если заявления:
if ch.isWearing 'doofy glasses':
render with doofy shader
else if ch.isWearing ...
не работает. Необходимо добавить предложение для каждой части. Класс может стать большим и сложным очень быстро.
модельСтратегии:
class TractionControlStrategy
class ABSstrategy
class Toyota:
TractionControlStrategy tcs
ABSstrategy abs
run():
if tcs not null:
tcs.run()
if abs not null:
abs.run()
carWithTCS = new Toyota(new TractionControlStrategy())
Не намного лучше, чем предыдущее решение, как вы до сих пор длинный список если заявления
Стратегия с подклассами:
class Toyota:
run():
// does nothing
class ToyotaWithABS : Toyota
ABSstrategy abs = new ABSstrategy()
run():
abs.run
class ToyotaWithTCS : Toyota ...
удовлетворяющего Открытым/Закрытый принцип, я думаю. Лучше, чем предыдущий? Но теперь вам нужно создать класс для каждой комбинации конфигураций. Если позже вы узнаете, что есть другие дополнительные функции, количество классов будет удвоено для каждой функции, которую вам нужно реализовать ...
Как можно моделировать эти типы взаимодействий и поведения с помощью ООП? Какие шаблоны дизайна или комбинации шаблонов дизайна способствуют этому?
Действительно не уверен, что это хороший вопрос, или если я понимаю, что я прошу, поскольку я никогда не практиковал хороший дизайн программного обеспечения.
Я изучаю OpenGL, работая над своим 3D-сеткой/модельным классом. Этот вопрос связан с тем, что в моем рендерере индексирование и текстуры являются необязательными для сетки. Таким образом, сетка может быть только вершинами, индексированными вершинами, вершинами и текстурами или всеми 3. Кроме того, я не могу предвидеть, какие функции я могу добавить в будущем, поскольку я не знаю, что я буду изучать, как месяц вниз по линии, поэтому мне нужен класс, чтобы быть гибким и расширяемым.