在做android项目时,经常会听到MVP模式,那么到底什么是MVP,在这之前,我们来回顾一下MVC。
MVC(model-view-controller)是将业务逻辑、界面、数据分离的一种设计典范。同样,MVP(model-view-presenter)也是为了界面与逻辑、数据分离的一种模式。他是MVC的演化版本。
对应关系:
Model对应的是业务逻辑和实体类型
View对应的是activity(IUserView),负责view的绘制与用户的交互。
Presenter负责完成model与view之间的交互。
以上都是摘自网络,下面通过demo记录一下我的看法。
一个简单的登录demo(貌似官方提供的例子就是这个)
1、文件结构
首先定义界面,LoginActivity中有两个EditText和一个Button;当我们点击button的时候需要执行登录操作。按照我以前的编码习惯,代码会如下:
login.setOnClickListener(newView.OnClickListener(){
@Override
public void onClick(View v) {
//TODO联网登录
}
});
但是,当我学习了MVP以后就不会这样写,这样写可以实现想要的结果,但是这样将view与数据、逻辑全部纠缠在一起,不利于代码的维护,如果我改变了界面布局,或者增加了其他功能,就会把代码变的繁杂,而且可能对以前的功能造成影响。So,我们来看看mvp咋样做的。
这里,需要执行联网登录的操作,定义一个Presenter,前面说过,他是负责view与model交互的桥梁,所以presenter需要有一个login方法:
那么这个login方法具体做什么操作呢?我们执行一个登录的时候,首先要执行一个进度动画,在去执行登录的具体操作,但是我们的presenter不是UI,怎样去操作Activity去执行进度呢?这里我们就要清楚一点,presenter操作view的时候不是直接操作Activity的,而是操作UserLoginView,这里的UserLoginView是一个接口;
这个接口里面定义了几个方法,分别是用来获取用户名、获取密码、显示进度、隐藏进度、切换到主界面、显示错误信息的。让Activity来实现这个接口,进而实现这个接口里的几个方法。当我们presenter来操作这个接口的时候,就实现了操作activity更改UI的操作。
更改UI实现了,那么presenter是如何操作model的,作为一个登录功能,当然需要有login方法,我们定义一个接口:
这个接口里面定义了一个登录的方法,该方法需要三个参数:用户名、密码、监听回调。这个回调同样是一个接口,当login执行完成后,通过这个监听来告诉presenter结果。
同样,他里面定义了两个方法,成功或者失败。
这时候,创建一个IUserLogin类,这个类的就是我们实现登录接口的类。
创建好这个(model)登录的类,就在presenter中去操作他,当它执行完成后,返回结果给presenter,presenter根据返回的结果去操作UserLoginView来实现UI的更改,达到与用户交互的效果。
demo中还有几个值得注意的地方。
我们demo中模拟了一个登录过程,所以login中起了一个工作线程,当我们的presenter中调用了model的login返回结果后要调用view来更改UI,这时候要回到UI线程,否则会出现异常导致app奔溃。
Demo中用到了Handler的post方法;这个方法的作用是执行完耗时操作后,返回到主线程。底层类似sendMessage机制。
到此,一个简单的MVP模式的demo就做完了,要想深入了解MVP,还需要我在工作中多实践,多学习别人优秀的代码以及编码思维。
demo下载地址http://download.csdn.net/detail/qq_34225872/9664297