Java(Android通用)语言简单实现MVP模型

MrLee2016-3-36690

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,项目分支可以先看下。

QQ截图20160303160030


顺序为:数据模型,接口,实现接口,事件,程序窗口及视图。代码虽然不多,不过文件和包名似乎有点多。哈哈……没关系,熟悉了之后就不觉得多了。而且大项目的话,这点算啥!先来看界面部分的源码:
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");
	}
}

运行效果:

QQ截图20160303155651


然后再看视图相关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);
					}
				});
	}
}

点击效果图:

QQ截图20160303155644


最后上源码:MyMVP 只有8KB哦,是不是很小!

本文链接:http://www.ithtw.com/thread-7908.htm
转载请注明:2016-3-3 于 IT十万个为什么 发表
推荐阅读
最新回复 (0)
回复
登录发表 or 还没有账号?去注册