Я думаю, вы должны разработать это по контракту интерфейса.
Я бы сделал ваши стены, роботы и датчики воплощениями различных «вещей», о которых пользовательский интерфейс должен знать.Только эти интерфейсы должны быть общими для пользовательского интерфейса и вашей модели.
Например, Robot, Sensor должен реализовывать интерфейс с именем Printable:
public interface Printable {
Shap getShape();
}
Wall должен реализовывать расширенный интерфейс PrintableTexture
public interface PrintableTexture extends Printable {
Texture getTexture();
}
Вы также можете создавать и реализовывать интерфейсы типа поставщика данных для угла, направления и т. Д.
Например:
public interface RangeProvider {
Range getRange();
}
public interface DirectionProvider {
Direction getDirection();
}
public interface SensorProvider {
Sensor[] getSensors();
}
Суть в том, что 'печатьЗатем код проверяет, какие интерфейсы реализуются объектом Printable (или списком объектов Printable), который был передан ему, и реагирует соответствующим образом.
Глядя на ваши комментарии, я думаю, что PrintableRobot, PrintableWall,и т.д. - это неправильное понимание фундаментальной концепции интерфейса.Интерфейс должен быть больше о том, «что что-то обеспечивает или как вы можете его использовать», а не о конкретной реализации того, как это достигается.Помещая Robot, Wall и т. Д. В Printable, вы даете указание на реализацию.
Помимо этого, вы рассматривали Шаблон посетителя ??Вы можете сделать так, чтобы каждая сущность реализовала принимающую часть шаблона посетителя, и чтобы ваш код печати был специальной реализацией, которая берет только то, что ему нужно, из более глубокого знания того, что делает каждая сущность ... Это не то, что я бы сделал, ноэто может вас устроить ...