2014-09-27 4 views
1

В проекте java swing у меня есть модельный класс, который содержит состояние определенного JPanel. Мне нужно сделать эти данные доступными для представления. Есть два варианта, как я его вижу. Имейте класс, который расширяет Observable и имеет модель как переменную экземпляра. См. Пример кода ниже. Или просто класс модели расширяется. Соблюдается.Если класс модели расширяется Observable или должен быть переменной в классе, которая расширяет Observable Observable

public class BoardObservable extends Observable { 

private Board board; 

public Board getBoardText() { 
    return board; 
} 

public void setBoardText(Board board) { 
    this.board = board; 
    setChanged(); 
    notifyObservers(board); 
} 
} 

Таким образом, в классе представления, реализующего наблюдатель будет использовать либо Observable параметр или параметр объекта для заполнения в JPanel.

@Override 
public void update(Observable o, Object arg) { 
    if(o instanceof BoardObservable) { 
     this.board = (Board) arg; 
    } 
} 

Какой из лучших вариантов?

ответ

1

Как показано выше, использование дополнительного класса кажется излишним. Однако, на самом деле, пытаясь понять, что вы пытаетесь сделать, похоже, что вы поддержали дизайн Model-View-Controller (MVC).

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

BoardObserver должен стать вашим контроллером. Он также должен быть наблюдателем Совета, но он также обращается к объекту Совета напрямую. Если есть какие-либо изменения в модели, которые влияют на представление (а не просто обновление информации, но логическое состояние - как кнопка, которая отключается из-за состояния программы или данных), контроллер должен обработать эту информацию и сделать соответствующие обновления к виду.

Сделайте вид на наблюдателя Совета. Представление должно информировать контроллер о любых действиях, и контроллер должен обновить логическое состояние (отключить кнопку и т. Д.) Представления. Если исходные данные в модели меняются, вы можете напрямую обновить представление.

И наконец, потянув все это вместе. Я склонен передать модель в конструктор контроллера и позволить контроллеру создать (и ... управлять) представление.

Model m = new Model(); 
Controller c = new Controller(m); 
1

Ваш подход зависит от observer pattern, исследовали here. Потому что Observable и Observer являются взаимодополняющими, вам нужны оба. Как правило, модель может распространяться на Observable, как показано в вашем BoardObservable, но ваша модель может delegate содержать, если необходимо, Observable. Напротив, представление должно только реализовать интерфейс Observer; этот example делегирует обновления вложенным ModelObserver.

Приведены альтернативные подходы к реализации шаблона наблюдателя here. См. Также answer на контроллерах Swing.

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