Самый простой способ скрыть часть открытых классов класса / Интерфейс - PullRequest
5 голосов
/ 18 мая 2011

Я пытаюсь спроектировать интерфейс GUI симулятора робота (по сути, простая игра).Однако я не знаю лучшего способа передачи компонентов симулятора (таких как роботы и стены) на дисплей.Я хочу скрыть не ориентированную на отображение информацию о компонентах (например, массу роботов), но все же иметь возможность распознавать каждый компонент, который я печатаю, т.е. когда я рисую компоненты, я хочу рисовать роботов иначе, чем я делаю стенывозможно у робота будет имя тега или что-то).

Вот изображение, которое, мы надеемся, объяснит дизайн: Program Design

Возможно, есть полезный шаблон дизайна, с которым я еще не сталкивался ...

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Я думаю, вы должны разработать это по контракту интерфейса.

Я бы сделал ваши стены, роботы и датчики воплощениями различных «вещей», о которых пользовательский интерфейс должен знать.Только эти интерфейсы должны быть общими для пользовательского интерфейса и вашей модели.

Например, 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, вы даете указание на реализацию.

Помимо этого, вы рассматривали Шаблон посетителя ??Вы можете сделать так, чтобы каждая сущность реализовала принимающую часть шаблона посетителя, и чтобы ваш код печати был специальной реализацией, которая берет только то, что ему нужно, из более глубокого знания того, что делает каждая сущность ... Это не то, что я бы сделал, ноэто может вас устроить ...

1 голос
/ 18 мая 2011

Оформление шаблона проектирования модели-вида-контроллера.Он разделяет данные (скорость робота, размер, ...), представление (форма робота и его метод рисования) и поведение (увеличение скорости робота).

Чтобы ответить на ваш вопрос - самый простой способ скрыть части API класса - это разделить этот класс на несколько частей (модель, представление, контроллер) и соединить их по некоторому шаблону (MVC или представление модели).-представитель, их много).

РЕДАКТИРОВАТЬ : Извините за то, что я не привел ни одного примера.Я предлагаю просто разделить Robot на два класса:

  • RobotData (содержит скорость, размер, ... предоставляет методы получения / установки, простой объект Java-бина)
  • RobotUi (предоставляет метод фигуры (используя личную ссылку RobotData))

Затем Simulator содержит коллекцию RobotUi (Simulator является модель )SimulatorDisplay (= view ) перебирает объекты пользовательского интерфейса при выполнении метода рисования.Данные RobotData будут скрыты внутри RobotUi.

...