Java MVP的具体代码示例
有人能提供一个具体的(实际的Java代码)MVP实例吗 这将包括以下3种类型的类,以及它们如何调用彼此的方法来实现模式和处理/响应客户端响应:Java MVP的具体代码示例,java,design-patterns,mvp,Java,Design Patterns,Mvp,有人能提供一个具体的(实际的Java代码)MVP实例吗 这将包括以下3种类型的类,以及它们如何调用彼此的方法来实现模式和处理/响应客户端响应: 模型-某种价值对象(VO) 视图-表示或生成用户界面 演示者-业务逻辑 MVP是我最喜欢的创建UI的设计模式 MVP和MVC的最大区别在于如何处理视图 在MVC中,控制器操纵视图,负责如何在视图中渲染用户动作和模型的部分。这意味着控制器和视图具有“紧密耦合” 在MVP中,演示者负责用户任务,模型在演示者和视图之间共享。因此,视图根据模型呈现UI,有时
- 模型-某种价值对象(VO)
- 视图-表示或生成用户界面
- 演示者-业务逻辑
- 在MVC中,控制器操纵视图,负责如何在视图中渲染用户动作和模型的部分。这意味着控制器和视图具有“紧密耦合”
- 在MVP中,演示者负责用户任务,模型在演示者和视图之间共享。因此,视图根据模型呈现UI,有时视图可以从演示者调用操作。演示者和视图可以有一个定义的接口契约,使它们“松散耦合”。例如,您可以为JavaSwingUI创建一个视图,为JavaFXUI创建另一个视图。或者,如果与数据源的连接发生更改,则只需更新演示者即可
/*-- 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();
}
});
}
}
所以不这样做;这不是一个讨论或一般教程论坛。请阅读和。另外,你的问题可以通过谷歌搜索很容易地得到回答。请跳过这里,但MVP是MVC的另一个名称吗?@Esko有区别:@Jim-这是一个特定的问题(信不信由你)!!猜猜在谷歌搜索MVP时,会出现多少具体的、特定于Java的代码示例?没有@Esko-我不是专家,但已经离开学校三年了,我开始意识到我们在软件工程I课上学到的很多“理论”东西只是…*理论*!这些博士都很聪明,而且很擅长(事实上,这就是他们的谋生之道!)在他们的白皮书中提出三个字母缩写的模式,但正如我们看到的MVC、MVP、MVVM和谁知道还有什么……当你揭开面纱时,一切都只是“皇帝的新衣”我敢打赌MVC/MVP/MVVM都首先出现在一些博士的博士论文中……它们听起来很棒,但形式重于实质。这意味着控制器和视图具有“紧密耦合”。谢谢这是我对MVC感到疑惑的一件事。也很高兴您发布了一个非常清晰的MVP Java示例;不是应显示在视图中的行。此外,updateModelFromView和updateViewFromModel不是MVP中视图的预期方法。演示者应持有所有演示文稿登录。视图不应该以任何方式访问模型。在视图中使用模型(如JDOI)是否可以接受?我想你已经在MVC和MVP之间切换了,看看这个: