Как View узнает, какой компонент создать? - PullRequest
2 голосов
/ 10 марта 2010

Я разрабатываю это приложение, где вы можете разместить текст и рисунки на странице. Мое приложение написано по шаблону MVC, и мне нужно, чтобы все части модели, текст и фигуры имели одинаковое представление. Все они расширяют абстрактный класс ReportElement, например.

Но проблема в том, что я создаю JPanel для каждой фигуры на странице, но для обработки текста мне нужно использовать JTextArea или что-то еще. Для визуализации элементов представление напрямую получает список элементов отчета из модели и рисует один за другим. Как я могу отличить текстовый элемент без ущерба для шаблона MVC.

Я имею в виду, это невозможно, верно? Не знаю, есть идеи?

Ответы [ 2 ]

2 голосов
/ 10 марта 2010

Я думаю, вы ищете " Factory Pattern "

Вам необходим метод-обертка, который возвращает JComponent в зависимости от ваших ReportElement условий.

2 голосов
/ 10 марта 2010

Я бы справился с этой ситуацией, построив фабричный метод, который производит правильный тип компонента Swing для любого заданного ReportElement, например:

public static JComponent buildViewForReportElement(ReportElement element)

Внутри этого метода вам нужно будет на самом деле проверить объекты ReportElement, чтобы увидеть, какой тип компонента построить. Эта проверка может означать проверку поля или флага на каждом объекте или может даже означать использование instanceof для различения различных подклассов ReportElement друг от друга.

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

К сожалению, объектно-ориентированное решение заставляет вас смешивать код представления с кодом модели, и хорошо, что вы пытаетесь разделить их. Вот почему я бы рекомендовал не создавать код для построения GUI из объектов ReportElement и вместо этого использовать фабричный метод для построения правильного представления для любого заданного ReportElement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...