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)
站点信息
- 文章2302
- 用户1336
- 访客10962994
每日一句
Progress starts with one brave step forward.
进步始于一次勇敢的迈步。
进步始于一次勇敢的迈步。
新会员