概述
引言
如果对于mvp和mvc不太熟悉的童鞋,请花一点时间阅读下面文字内容,纯手工打些本人一点粗糙的见解。或者问问度娘多多学习。熟悉者可直接跳过看干货,撸代码阶段。
在说mvp之前,相信大家应该都熟悉了mvc(model 、 view 、 control)。在Android的架构中Activity,fragment,布局的xml相当于View。然而在实际的开发过程中,Android的View层任务太繁重,大家将V和C都糅杂在Activity、Fragment中,这就导致了在实际开发中View层太过累赘,一不小,几次代码迭代过后,一个Activity或者Fragment中的代码就有几千行,有时候修改个功能在笨重的代码中摸爬滚打半天才找到关键点,对于不熟悉代码的开发者来说(或者前人编写代码质量太低)那代码迭代接手后简直是妙不可言。所以将视图和业务逻辑代码分开势在必行。
基于这个现状,我们伟大的Google粑粑设计了一个更优的框架模式来解决这个问题。就是目前实际开发中火热的MVP模式(model 、 view 、presenter)。用presenter将model和view隔离开来,一切业务逻辑处理都是通过presenter来进行操作,也就是说presenter是视图的数据的桥梁,视图和数据相隔两端,“可远观而不可亵玩”。强制只能使用presenter作为“邮递员”来”通信“。
正文
上图最为直接,区别:mvc结构,一眼便知,model和view并没有隔离,view一只手悄悄的碰到了model层。而mvp中presenter完全垄断了与数据实体的”贸易“。视图要数据必须通过presenter。这样将业务逻辑剥离出去,视图层专注view的展现。
万事万物,有优点就有缺点,伟大的孟子大学者就曾说过”鱼与熊掌不可兼得“。
优点:最大的优点剥离了视图层和业务逻辑层,让各个类的分工更为明确,逻辑更为清晰,代码扩展性更高,后期代码迭代更新更加容易,同时也方便了单元测试的编写,以前将视图与业务混合在一起的时候,要写单元测试很多时候真的是无从下手。相对于MVP模式来说写单元测试就更加容易了。因为职责更加清晰,测试的目标就明确多了。
缺点:相对而言,MVP模式的代码量就多了,类文件也多了,简单的一个业务逻辑操作就要各方来配合协作(即是需要presenter 和 view的接口)。但是这个问题完全在可以接收的范围。完全符合Java的抽象封装设计原则(接口隔离,开闭原则,里氏代换不熟悉的童鞋阔以问问伟大的度娘)。
![](https://upload-images.jianshu.io/upload_images/4370725-c27004c51e50c4cc.png?imagemogr2/auto-orient/strip%7cimageview2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/4370725-a173164dac5ba876.png?imagemogr2/auto-orient/strip%7cimageview2/2/w/1240)
代码结构
首先是View和presenter的接口,抽象出view对象的绑定方法。
IView.java
public interface IView {
void bindView();
void UnbindView();
}
IPresenter.java
public interface IPresenter {
void register(V view);
void unRegister();
}
BasePresenter实现IPresenter接口,为业务逻辑层presenter的基类。用弱引用来接收View的对象,在取消注册的时候销毁view对象,保证View不会造成内存泄漏。
BasePresenter.java
public class BasePresenter implements IPresenter {
protected WeakReference iView;
@Override
public void register(V view) {
Log.i(TAG, "BasePresenter register: ");
iView = new WeakReference(view);
}
@Override
public void unRegister() {
Log.i(TAG, "BasePresenter unRegister: ");
iView.clear();
}
}
BaseActivity实现IView接口,为视图层的基类(也就是Activity的基类),这是一个抽象类,实现了视图层到业务逻辑层的绑定与解绑,抽象方法createPresenter()子类必须实现,来确保不通的业务逻辑层。
BaseActivity.java
public abstract class BaseActivity
extends Activity implements IView{
protected P iPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
bindView();
}
@Override
protected void onDestroy() {
super.onDestroy();
UnbindView();
}
@Override
public void bindView() {
iPresenter = createPresenter();
iPresenter.register(this);
}
@Override
public void UnbindView() {
iPresenter.unRegister();
}
protected abstract P createPresenter();
}
接下来是具体的使用MVP的流程了,定义三方交接接口
public interface DemoContract {
interface View{
void demoView(String test);
}
interface Presenter{
void demoPresenter();
}
interface Model{
void demoModel(ModelListener modelListener);
interface ModelListener{
void completed(String test);
}
}
}
视图层DemoActivity.java基层BaseAcitivity实现createPresenter()方法,DemoContract.View接口。
public class DemoActivity extends BaseActivity implements DemoContract.View {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iPresenter.demoPresenter();
}
@Override
protected DemoPresenter createPresenter() {
return new DemoPresenter();
}
@Override
public void demoView(String test) {
Toast.makeText(this, test, Toast.LENGTH_LONG).show();
}
}
业务逻辑层DemoPresenter.java基层BasePresenter实现DemoContract.Presenter接口
public class DemoPresenter extends BasePresenter implements DemoContract.Presenter {
DemoContract.Model model = new DemoModel();
@Override
public void demoPresenter() {
model.demoModel(new DemoContract.Model.ModelListener() {
@Override
public void completed(String test) {
iView.get().demoView(test);
}
});
}
}
数据实体层DemoModel.java实现DemoContract.Model接口,用接口回调异步返回数据。
public class DemoModel implements DemoContract.Model{
@Override
public void demoModel(ModelListener modelListener) {
modelListener.completed("mvp test");
}
}
最后附上源码传送门:https://github.com/pffo/mvp
*请大神多多指教*
最后
以上就是时尚飞机为你收集整理的Android MVP模式直接用版本最后附上源码传送门:https://github.com/pffo/mvp的全部内容,希望文章能够帮你解决Android MVP模式直接用版本最后附上源码传送门:https://github.com/pffo/mvp所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复