Скажем, у меня есть ниндзя с определенными настраиваемыми навыками. Под настраиваемым я подразумеваю, что программа считывает файл конфигурации и добавляет их во время выполнения. то есть:
Ninja:
color: Red
Skills:
- High Jump
- Invisibility
Теперь предположим, что эти навыки необходимы для динамического добавления функциональности классу Ninja. Например, если мы настроим Ninja на навык High Jump, тогда класс должен будет следовать интерфейсу CanHighJump с общедоступным void highJump () в качестве метода.
Я могу думать о том, чтобы сделать это двумя способами. Моей первой реакцией было бы иметь класс Ninja с цветом String, а затем использовать Reflection для добавления функциональности. Однако теперь я понимаю, что могу сделать это и с помощью реляционной базы данных. Имейте класс Ninja с цветом String и забудьте о любых объектах, связанных с Ninjas with Skills - вместо этого, когда мне нужно проверить навык, просто позвоните в базу данных, чтобы получить возможные навыки, которые может использовать этот класс. Это единственные два действительно динамичных решения, которые я могу придумать, и я не могу понять достоинства и недостатки дизайна каждого из них. Я чувствую, что решение для базы данных было бы гораздо более масштабируемым, но метод отражения имел бы для меня наибольший смысл при кодировании. Не нужно спрашивать, какими навыками обладает ниндзя, потому что я могу легко проверить интерфейс.
Я надеюсь, что кто-то может дать мне некоторое представление о стандартном дизайнерском решении этой проблемы. Будь то один из двух, которые я придумал, или, что более вероятно, что-то, о чем я не подумал.