Android MVP模式直接用版本

引言

        如果对于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的抽象封装设计原则(接口隔离,开闭原则,里氏代换不熟悉的童鞋阔以问问伟大的度娘)。



MVC模式

                        


MVP模式



   

   代码结构

            首先是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

*请大神多多指教*


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值