MVP简介
MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会直接从Model中读取数据而不是通过 Controller。 在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。我用Java语言简单写了一个Demo,项目分支可以先看下。

顺序为:数据模型,接口,实现接口,事件,程序窗口及视图。代码虽然不多,不过文件和包名似乎有点多。哈哈……没关系,熟悉了之后就不觉得多了。而且大项目的话,这点算啥!先来看界面部分的源码:
package com.mvp.ui;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.JProgressBar;
import javax.swing.JTextField;
import com.mvp.bean.Error;
import com.mvp.bean.User;
import com.mvp.presenter.UserLoginPresenter;
import com.mvp.view.IUserLoginView;
public class MainFrame extends JFrame implements ActionListener, IUserLoginView {
private static final long serialVersionUID = 7408747442747769564L;
private JTextField textField;
private JPasswordField passwordField;
private UserLoginPresenter loginPresenter;
private JProgressBar bar;
public MainFrame(String title) throws HeadlessException {
super(title);
// TODO Auto-generated constructor stub
loginPresenter = new UserLoginPresenter(this);
Container container = getContentPane();
container.setLayout(new FlowLayout());
container.add(new JLabel("用户名"));
textField = new JTextField("user", 16);
container.add(textField);
container.add(new JLabel("密 码"));
passwordField = new JPasswordField("123456", 16);
container.add(passwordField);
container.add(newJButton("登录"));
bar = new JProgressBar(JProgressBar.HORIZONTAL);
container.add(bar);
bar.setVisible(false);
bar.setIndeterminate(true);
setSize(280, 130);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
}
private JButton newJButton(String title) {
JButton button = new JButton(title);
button.addActionListener(this);
return button;
}
@Override
public String getUserName() {
// TODO Auto-generated method stub
return textField.getText();
}
@Override
public String getUserPassword() {
// TODO Auto-generated method stub
return new String(passwordField.getPassword());
}
@Override
public void showLoading() {
// TODO Auto-generated method stub
bar.setVisible(true);
}
@Override
public void closeLoading() {
// TODO Auto-generated method stub
bar.setVisible(false);
}
@Override
public void successful(User user) {
// TODO Auto-generated method stub
System.out.print(user.getName());
System.out.println(":恭喜登录成功");
}
@Override
public void failed(Error error) {
// TODO Auto-generated method stub
System.out.print("登录失败:");
System.out.println(error.getMsg());
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object obj = e.getSource();
if (obj instanceof JButton) {
String str = ((JButton) obj).getText();
if (str.equals("登录")) {
loginPresenter.login();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new MainFrame("Java MVP模式演示Demo");
}
}
运行效果:

然后再看视图相关IUserLoginView,这个接口主要是和界面交互的
package com.mvp.view;
import com.mvp.bean.Error;
import com.mvp.bean.User;
public interface IUserLoginView {
public String getUserName();
public String getUserPassword();
public void showLoading();
public void closeLoading();
public void successful(User user);
public void failed(Error error);
}
最后来看UserLoginPresenter,其它的省略过,直接下载源码。
package com.mvp.presenter;
import com.mvp.bean.Error;
import com.mvp.bean.User;
import com.mvp.impl.ILoginListener;
import com.mvp.model.UserModelImpl;
import com.mvp.view.IUserLoginView;
public class UserLoginPresenter {
UserModelImpl modelImpl;
IUserLoginView loginView;
public UserLoginPresenter(IUserLoginView loginView) {
super();
this.loginView = loginView;
modelImpl = new UserModelImpl();
}
public void login() {
loginView.showLoading();
modelImpl.login(loginView.getUserName(), loginView.getUserPassword(),
new ILoginListener() {
@Override
public void loginSuccessful(User user) {
// TODO Auto-generated method stub
loginView.closeLoading();
loginView.successful(user);
}
@Override
public void loginFailed(Error error) {
// TODO Auto-generated method stub
loginView.closeLoading();
loginView.failed(error);
}
});
}
}
点击效果图:

最后上源码:MyMVP 只有8KB哦,是不是很小!
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2313
- 用户1336
- 访客11757218
每日一句
Life is short; Live it!
人生苦短,活出精彩。
人生苦短,活出精彩。
信鸽推送报错NSObject checkTargetOtherLinkFlagForObjc
简单利用Clover四叶草安装U盘安装黑苹果
学习使用Java注解
OllyDbg中如何找出B模块中所有调用了A模块的C方法的地方
解决SSH客户端中文乱码
10年后,Android应用程序仍然比iOS应用程序差
C++11特性里面的thread
XPosed微信自动生成二维码
解决android studio "found an invalid color"的问题
T9社区注册方法【勼适様鲃女尔懟死】
Thinkpad x1 Extreme黑苹果10.14.5安装完成
基于大白主题增加图片本地化的功能
Linux系统查看CPU使用率的几个命令
新会员