Вопрос по архитектуре приложения - PullRequest
3 голосов
/ 04 июля 2010

Я новичок в разработке ОО систем. У меня есть простое приложение Flash Cards, где я не могу понять, как правильно спроектировать систему. Приложение имеет простой графический интерфейс с кнопками «вопрос», «ответ» и «пара». Набор данных вопросов и ответов хранится во встроенной базе данных Derby.

Быстрая настройка:
Класс базы данных - обрабатывает подключение, отключение и возвращает ArrayList на основе выбранного фильтра (в данный момент вызываемого объектом CardSet) (класс DB настроен как статический)
Класс CardSet - содержит список ArrayList, используемый в данный момент, содержит текущую карту
Класс карты - содержит данные для флэш-карты (вопрос и ответ, пара других вещей)
Класс приложения - создает графический интерфейс и обрабатывает события действия

Итак, вот мой вопрос: я хочу отделить графический интерфейс и логику приложения. Я думаю, что это может быть хорошим случаем для MVC, но я не уверен, как действительно отделить все это (никогда не использовал это). Создается ли класс контроллера в main, который затем запускает графический интерфейс, а затем создает другие классы (в моем случае, CardSet). Как насчет доступа? Должны ли определенные вещи быть статичными?

Еще один вопрос - для обработки событий GUI, вы просто настроили его для вызова универсального метода в классе контроллера? Например, нажата кнопка «Следующая карта», должна ли она просто вызывать что-то вроде controller.nextCardAction ()? Стоит ли просто использовать шаблон Observer, чтобы графический интерфейс мог извлекать данные?

Извините за вопросы новичка, но это мой первый опыт в приложении Java. Любая помощь будет отличной. Хорошие ссылки также приветствуются. У меня есть книга Head First Design Patterns, но у меня просто нет достаточно реальных примеров, чтобы полностью понять ее для моего приложения.

Ответы [ 2 ]

1 голос
/ 04 июля 2010

Вот очень простой пример и обсуждение , которые могут быть полезны.

Где бы вы прочитали материал БД?

Я быожидайте, что модель будет поддерживать ссылку на текущий CardSet, инициализируя ее по умолчанию в конструкции и пополняя ее всякий раз, когда контроллер говорит, что пользователь хочет новый набор.Только CardSet знает, откуда взялись Card или как получить новый набор.В ответ на действие пользователя представление запрашивает у модели следующую или предыдущую карту и обновляет себя, когда оно слышит от модели, к которой оно прослушивает.

Не путайте контроллер с элементами управления: обапредставление и контроллер могут управлять такими элементами управления, как кнопки.В приведенном примере на контроллере имеется кнопка сброса, а в представлении - панель игровых кнопок.В вашем приложении контроллер может инициировать изменение наборов, в то время как представление имеет элементы управления для перемещения между картами в наборе.

Для справки, сплошные линии на диаграмме MVC являются вызовами методови пунктирные линии являются обратными вызовами для слушателя.В приведенном примере классы Observable и Observer обеспечивают обратный вызов update(), но механизм EventListenerList также распространен.

1 голос
/ 04 июля 2010

Посмотрите на шаблон слушателя.

Перепишите часть своего графического интерфейса, чтобы прослушать «текущую карту памяти». Код для графического интерфейса должен выглядеть примерно так:

public interface ModelListener {
   public void modelChanged();
}

public class FlashCardView implements ModelListener {

   private FlashCard model;

   public FlashCardView(FlashCard card) {
     setModel(card);
   }

   public void setModel(FlashCard card) {
     if (model != null) {
       model.removeListener(this);
     }
     model = card;
     model.addListener(this);
   }

   public void modelChanged() {
     (read out model values and update the screen displayed values)
   }

}

public interface Model {
    public void addListener(ModelListener listener);
    public void removeListener(ModelListener listener);
}

public class FlashCard() {

   private String answer;

   private String question;

   private Vector<ModelListener> listeners;

   public FlashCard(String question, String answer) {
     this.question = question;
     this.answer = answer;
     this.listeners = new Vector<ModelListener>();
   }

   public void setAnswer(String newAnswer) {
     this.answer = newAnswer;
   }

   public void setQuestion(String newQuestion) {
     this.question = newQuestion
   }

   public void addListener(ModelListener listener) {
     listeners.add(listener);
   }

   public void removeListener(ModelListener listener) {
     listeners.remove(listener);
   }

   private void notifyListeners() {
     for (ModelListener listener : listeners) {
        listener.modelChanged();
     }
   }

}

Поместите все действия, которые выполняют ваши кнопки, и выбор «представлений» для отображения в любой момент времени в классе «Контроллер». По сути, он должен вызывать методы setModel(...), а также добавлять и удалять классы «представления» из текущего отображаемого окна.

Хотя это может показаться небольшим количеством кода для отображения простой карты памяти, помните, что многие из ваших моделей будут более изощренными, чем карты памяти. Возможно, вам понадобятся классы для представления тестов, тем и т. Д. В ближайшем будущем.

...