В настоящее время я работаю над настольным приложением, использующим JavaFX (обратите внимание, что я не использую Screen Builder, я создаю свое представление непосредственно в коде). Я хотел бы реализовать вариант пассивного представления шаблона MVP (Model View Presenter).
Поскольку я не смог найти четких примеров ... Я попытался создать базовую настройку самостоятельно.
Основной класс
public class Main extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
Model model = new Model();
View view = new View(stage);
Presenter presenter = new Presenter(model, view);
}
}
Модель
public class Model {
private StringProperty labelText;
public Model() {
this.labelText = new SimpleStringProperty();
}
public String getLabelText() {
return labelText.get();
}
public StringProperty labelTextProperty() {
return labelText;
}
public void setLabelText(String labelText) {
this.labelText.set(labelText);
}
}
Посмотреть
public class View {
private Button button;
private Label label;
public View(Stage stage) {
label = new Label("This is a test");
label.setLayoutX(50);
label.setLayoutY(50);
button = new Button("Click me");
button.setLayoutX(200);
button.setLayoutY(50);
Pane pane = new Pane();
pane.getChildren().addAll(label, button);
Scene scene = new Scene(pane, 400, 200); //Standard size 1200, 800
stage.setScene(scene);
stage.show();
}
public Button getButton() {
return button;
}
public void setButton(Button button) {
this.button = button;
}
public Label getLabel() {
return label;
}
public void setLabel(Label label) {
this.label = label;
}
}
Presenter
public class Presenter implements EventHandler<ActionEvent> {
private Model model;
private View view;
public Presenter(Model model, View view) {
this.model = model;
this.view = view;
//Register action listener for button
this.view.getButton().setOnAction(this);
//Register change listeners of model
this.model.labelTextProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
//Update view
}
});
}
@Override
public void handle(ActionEvent event) {
if (event.getSource() == this.view.getButton()) {
//Update model
}
}
}
Я подумал, что при реализации модели пассивного просмотра следует учитывать следующее:
- Модель и вид полностью разделены
- Просмотр создает и отображает только элементы пользовательского интерфейса
- Модель содержит данные приложения и логику для изменения этих данных
- Presenter обновляет модель, а также вид
- Presenter регистрирует прослушиватели событий действия и, при необходимости, обновляет модель (View -> Presenter -> Model)
- Presenter прослушивает изменения модели и, при необходимости, обновляет представление (Модель -> Presenter -> Представление)
Используя эту информацию, я попытался построить эту базовую структуру для настройки модель-представление-презентатор. Правильно ли я реализовал пассивный вид?