gpt4 book ai didi

java - MVP的具体代码示例

转载 作者:IT老高 更新时间:2023-10-28 20:53:44 25 4
gpt4 key购买 nike

有人能提供一个实际的 MVP 的具体(实际 Java 代码)示例吗?

这将包括以下 3 种类型的类以及它们如何调用彼此的方法来实现模式和处理/响应客户端响应:

  • 模型 - 某种值(value)对象 (VO)
  • View - 表示或生成 UI
  • Presenters - 业务逻辑

最佳答案

MVP 是我最喜欢的 UI 设计模式。

MVP 和 MVC 最大的区别在于如何处理 View 。

  • 在 MVC 中, Controller 操作 View ,负责如何在 View 中呈现用户操作和模型的部分。这意味着 Controller 和 View 具有“紧密耦合”。
  • 在 MVP 中,Presenter 负责用户任务,模型在 Presenter 和 View 之间共享。因此 View 根据模型渲染 UI,有时 View 可以从 Presenter 调用操作。 Presenter 和 View 可以有一个定义的接口(interface)契约,使它们“松耦合”。例如,您可以为 Java Swing UI 创建一个 View ,为 JavaFX UI 创建另一个 View 。或者,如果与数据源的连接发生变化,那么您只需更新演示者即可。

MVP 有多种编程方式。

在形式上,包括为设计模式的每个元素创建接口(interface)。

/*-- file: Application.java --*/
import javax.swing.JOptionPane;

/**
*
* @author danLeon
*/
interface LoginModel {

String getUser();

void setUser(String user);
}

class MyLoginModel implements LoginModel {

String user;

@Override
public String getUser() {
return user;
}

@Override
public void setUser(String user) {
this.user = user;
}
}

interface LoginView {

LoginPresenter getPresenter();

void setPresenter(LoginPresenter loginPresenter);

void updateModelFromView();

void updateViewFromModel();

void open();

void close();

void userRejected();
}

class MyLoginView extends javax.swing.JFrame implements LoginView {

private LoginPresenter loginPresenter;

/**
* Creates new form MyLoginView
*/
public MyLoginView() {
initComponents();
}


@SuppressWarnings("unchecked")
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;

jLabel1 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
jLabel2 = new javax.swing.JLabel();
jButton1 = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setBounds(new java.awt.Rectangle(0, 0, 0, 0));
java.awt.GridBagLayout layout = new java.awt.GridBagLayout();
layout.columnWidths = new int[] {0, 7, 0};
layout.rowHeights = new int[] {0, 7, 0, 7, 0};
getContentPane().setLayout(layout);

jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jLabel1.setText("Welcome");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 3;
getContentPane().add(jLabel1, gridBagConstraints);

jTextField1.setColumns(13);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
getContentPane().add(jTextField1, gridBagConstraints);

jLabel2.setText("User");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
getContentPane().add(jLabel2, gridBagConstraints);

jButton1.setText("Login");
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jButton1ActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 4;
getContentPane().add(jButton1, gridBagConstraints);

pack();
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
getPresenter().login();
}

private javax.swing.JButton jButton1;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JTextField jTextField1;


@Override
public void updateModelFromView() {
getPresenter().getModel().setUser(jTextField1.getText());
}

@Override
public void updateViewFromModel() {
jTextField1.setText(getPresenter().getModel().getUser());
}

@Override
public void open() {
setVisible(true);
jTextField1.selectAll();
jTextField1.requestFocus();
}

@Override
public void close() {
dispose();
}

@Override
public void userRejected() {
jLabel1.setText("Try again!");
jTextField1.selectAll();
jTextField1.requestFocus();
}

@Override
public LoginPresenter getPresenter() {
return loginPresenter;
}

@Override
public void setPresenter(LoginPresenter loginPresenter) {
this.loginPresenter = loginPresenter;
}
}

interface LoginPresenter {

LoginModel getModel();

void setModel(LoginModel loginModel);

LoginView getView();

void setView(LoginView loginView);

void setOnLogin(Runnable onLogin);

void run();

void login();
}

class MyLoginPresenter implements LoginPresenter {

LoginModel loginModel;
LoginView loginView;
private Runnable onLogin;

@Override
public LoginModel getModel() {
return loginModel;
}

@Override
public void setModel(LoginModel loginModel) {
this.loginModel = loginModel;
}

@Override
public LoginView getView() {
return loginView;
}

@Override
public void setView(LoginView loginView) {
this.loginView = loginView;
}

@Override
public void setOnLogin(Runnable onLogin) {
this.onLogin = onLogin;
}

@Override
public void run() {
loginModel.setUser("previousUser");
loginView.setPresenter(this);
loginView.updateViewFromModel();
loginView.open();
}

@Override
public void login() {
loginView.updateModelFromView();
if (loginModel.getUser().equalsIgnoreCase("root")) {
loginView.close();
loginView.setPresenter(null);// for memory sanity.
onLogin.run();
} else {
loginView.userRejected();
}
}
}

public class Application {

/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
LoginModel loginModel = new MyLoginModel();
LoginPresenter loginPresenter = new MyLoginPresenter();
loginPresenter.setModel(loginModel);
LoginView loginView = new MyLoginView();
loginPresenter.setView(loginView);
loginPresenter.setOnLogin(new Runnable() {

@Override
public void run() {
JOptionPane.showMessageDialog(null, "Welcome user!");
}
});
loginPresenter.run();
}
});
}
}

关于java - MVP的具体代码示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11367250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com