Я ищу правильный шаблон проектирования для объекта, который нуждается в различных реализациях для тонны методов, текущая реализация зависит от одной переменной, изменяемой во время выполнения.
Примите во внимание следующее:
Сетка, состоящая из нескольких гексов (плиток).
Каждая плитка имеет свой собственный «тип» (Вода / Огонь и так далее)
- Каждая плитка имеет несколько полей (например, ItemsOnTop), некоторые из которых являются общими для всех типов, в то время как некоторые зависят от типа.
- Плитки могут изменять свой тип, что меняет реализациюбольшинство методов и сохраняет некоторые (но не все) поля нетронутыми.
Самым простым и наименьшим решением OOPish было бы реализовать один класс Tile, который бы сохранял вид плитки в поле, возможно, используяперечисления, такого как
TileType type = TileType.WATER
, а затем залить тела методов с помощью операторов Switch, проверяющих TileType и соответствующим образом изменяющих поведение.
Другое решение,возможно, более чистый, будет объявлять основной абстрактный класс плиток и извлекать из него все другие типы плиток - такие как WaterTile, Firetile и так далее.Мастер-класс содержит пустые виртуальные методы для всех поведений плиток, таких как ExtinguishTile (), который не переопределяется в WaterTile (не может быть погашен, поэтому вызывается пустой класс ExtinguishTile (), и ничего не происходит), и переопределяется соответствующим поведением в FireTile.class.
Проблема с этим, на первый взгляд лучшим дизайном, состоит в том, что тип тайла может изменить время выполнения.У нас здесь есть объект, для которого мы хотим сохранить состояние (или, по крайней мере, некоторые поля), а также необходимость различной реализации тонны методов для каждого типа плитки.
Что быбыть правильным решением для этого?
Один «обходной путь» будет заключаться в реализации второго дизайна.Если необходимо изменить объект плитки, уничтожьте старый объект плитки, создайте новый объект плитки нужного типа и скопируйте все поля, которые должны быть перенесены.Хотя это звучит немного странно, и, возможно, кто-то более опытный мог бы что-то добавить.
Пожалуйста, укажите мне правильное направление.