MVP模式在android的使用

最近一直在写android方面的架构,并且优化模块间的关联,前一段时间一直听闻mvp的强大,拿来研究下罚下正解决优化的问题。

什么是mvp,和mvc的关系?

首先,mvp从mvc演变过来,所以有很多相同点,如果是由开发经验的同学一定熟知mvc,在这里就不啰嗦了。


直接看mvp的特点:
M--Model
V--View
P--Presenter([prɪˈzentə(r)] 节目主持人)


从上面可以看出来只有p是新角色,presenter的中文是节目主持人,那么在mvp中充当的整合资源的角色,就像主持人一样控制全场,无论是节目的流程把控,还是嘉宾的介绍,他不仅需要内容的信息,比如嘉宾的信息,节目的流程信息,同时还要把控其中的进度,所以我们发现主持人做的事情就是把各种信息整合到节目流程中展现给大家。

这一点和mvp的角色是一样的,他负责把view的数据(各种信息数据)和各种逻辑(节目流程)整合起来,让他们相互作用,从而达到让逻辑和view彻底脱钩关系,来看两张图:


MVP模式在android的使用_第1张图片 MVP模式在android的使用_第2张图片
图一是mvp的结构图,图二是mvc的结构图,我们能鲜明发现mvp中view和model没有直接关系,模型与视图完全分离,我们可以修改视图而不影响模型,我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。

-----------------------------------------------------------------

好了刚刚啰嗦了很多理论,下面来看看怎么用于实用。
假设我们要做一个登陆模块,这一个大家肯定经常写,那么用mvp怎么实现。

view--登陆界面

MVP模式在android的使用_第3张图片

model--用户bean

MVP模式在android的使用_第4张图片

        

Presenter--整合view和model

public class LoginPresenter {
	private IDataView dataView;
	private Loginimp loginimp;
public LoginPresenter(IDataView dataView) {
	// TODO Auto-generated constructor stub
	this.dataView=dataView;
	loginimp=new Loginimp();
}
public void doService()
{
loginimp.Login(dataView.getUsername(), dataView.getPassword(), new RequestCallBack() {
	
	@Override
	public void CallBack(boolean success) {
		// TODO Auto-generated method stub
		if (success) {
			dataView.showSuccessInfo();
		}else{
			dataView.showErrorInfo();
		}
	}
});	
}
}
可能有同学看不懂最后这个presenter,那么我们先从整体把控看一下结构:
MVP模式在android的使用_第5张图片
public interface IDataView {
String getUsername();
String getPassword();
void showSuccessInfo();
void showErrorInfo();
}

这里面就是负责获取用户名和密码的接口,那么怎么使用呢?



看到了吗,我们让activity实现这个接口,那么就要重写里面的四个方法,就会通过getuseranme和getpassword把用户输入到输入框的数据返回给Idataview的对象。
这个时候我们就能明白了,我们要通过Idataview 这个对象把数据传输给presenter,在上面presenter的代码中我们能看到是通过构造方法传递的。

这个时候再研究另外的东西,就是业务逻辑这部分,在这里是LoginImpl这个类:
public class Loginimp {

	
	public void Login(String username, String password, RequestCallBack callBack) {
		// TODO Auto-generated method stub
		if(username.endsWith("gxx")&&password.equals("123"))
		{
			callBack.CallBack(true);
		}else{
			callBack.CallBack(false);
		}
	}

}

里面就是一个登陆方法,然后我们在presenter中把这个类的对象同样获取
用于操作IdataView传递过来的view的数据,做登陆操作。
好了,我们知道presenter把数据和业务逻辑都包含到自己这里了,那怎么使用呢,看下面代码。

public class MainActivity extends Activity implements IDataView{
private EditText username;
private EditText password;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		username=(EditText) findViewById(R.id.main_username);
		password=(EditText) findViewById(R.id.main_password);
		
	}

	@Override
	public String getUsername() {
		// TODO Auto-generated method stub
		return username.getText().toString();
	}

	@Override
	public String getPassword() {
		// TODO Auto-generated method stub
		return password.getText().toString();
	}

	@Override
	public void showSuccessInfo() {
		// TODO Auto-generated method stub
		Toast.makeText(getApplicationContext(), "登陆成功!", Toast.LENGTH_LONG).show();
	}

	@Override
	public void showErrorInfo() {
		// TODO Auto-generated method stub
		Toast.makeText(getApplicationContext(), "登陆失败!", Toast.LENGTH_LONG).show();
	}
	public void login_click(View v)
	{
		LoginPresenter lPresenter=new LoginPresenter(this);
		lPresenter.doService();
	}
}

我们在按钮的监听事件中只是获取了presenter的对象并且执行的doservice方法,对于view层来说很简单,这就是mvp的魅力。
多说一嘴,这里面出来传递username和password这两个数据,其实我们还传递了两个方法逻辑,showsuccessinfo和errorinfo,这是做的反馈,登陆成功和失败的反馈,有同学可能说这个直接在业务逻辑里写就行了,但是记住这是view层的反馈,不能卸载业务逻辑层,所以也是通过Idataview交给了presenter处理,好了,完毕。

你可能感兴趣的:(MVP模式在android的使用)