2010-03-10 2 views
2

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

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

Я имею в виду, это невозможно, не так ли? Я не знаю, какие-то идеи?

ответ

2

Я думаю, что вы ищете «Factory Pattern»

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

+0

спасибо за ссылку, как и мужчина, что вы думаете о моем вопросе ниже? – Halo

+0

Этот шаблон не нарушает MVC. Фактически, ваш заводский метод должен быть во вспомогательном заводском классе, который имеет дело со всей этой логикой. Таким образом, ваш вид все еще только знает о макете, ваша модель о данных и ваш контроллер ... хорошо, контролируют;) Вы можете напрямую вызвать свой метод Factory из представления, поскольку он ведет себя как любой другой JComponent создатель. –

+0

hmm. основанный на вашем комментарии, если я скажу, что этот завод является частью механизма контроллера, а его класс должен быть в пакете контроллера, я ошибаюсь? – Halo

2

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

public static JComponent buildViewForReportElement(ReportElement element) 

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

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

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

+0

спасибо большое. теперь не делает вид «знаю» о модели и нарушает разделение между ними? или эта фабрика вещь скрывает это или что-то еще? – Halo

+0

Ну, сам завод не является частью представления и не является частью модели. Фабрика должна знать как модель, так и представление, но она не входит ни в одну из них. –

+0

спасибо человеку, будем надеяться, что все будет хорошо – Halo

Смежные вопросы