2

前言

为了巩固一下自己对mvp架构的理解,于是突生一个想法,用mvp架构来实现一点类似于微信的功能。所以就有了现在的标题高仿微信之mvp实现。希望自己在实现的过程中能熟练掌握mvp架构的精髓,同时我也在这写下自己在这过程中的成长与所思。该片文章为第一系列,以后会根据自己的进度来写下剩余的系列。还没接触的也可以一起来学习下,当然如有不对的欢迎来指教。

MVP

首先我来简单的解释下何为mvp

  • M就是Model ,这里主要负责的就是业务处理,数据的获取,例如数据库的读写,http的网络数据的处理。
  • V就是View ,顾名思义视图的意思,这里主要的任务就是处理各个界面ui控件的处理。
  • P就是Presenter ,控制器,这里负责的是ModelView之间的联系操作。

那么他们之间到底是如何联系在一起工作的呢?当一个界面被创建时首先调用ViewView调用Presenter中的相应操作,在Presenter中则调用了Model的数据操作方法,Presenter中获得数据时,则反过来调用View中接口传回给View层。这样就简单的实现了MVP中的合作流程。这样做的一个明显的好处就是把数据操作与主界面分离,完全隔离数据操作,使得各个功能实现模块化,降低他们之间的耦合性,只要命名合理就能迅速明白该方法的作用。下面以该项目为例。

本来想以主框架为例的,但主框架目前没有Model层,所以下面以微信中的第一个聊天微信窗口为例,用MVP来实现

View层

当我们打开微信聊天界面时,要先调用设置数据的方法所以我们可以定义一个接口,其中实现设置数据的方法:

public interface WXView {
    void setData(List<WXItemInfo> list);
}
相信大家一看方法名就能很好理解该方法要做的操作了

Model层

既然该层是实现对数据的操作,自然我们也可以定义一个接口,实现加载数据的方法:

public interface WXModel {
    List<WXItemInfo> initData();
}

定义完之后我们再定义一个类实现该接口,进行数据的加载;

public class WXModleImp implements WXModel{
    private List<WXItemInfo> mList;
    private WXItemInfo wxItemInfo;
    @Override
    public List<WXItemInfo> initData() {
        mList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            wxItemInfo = new WXItemInfo();
            wxItemInfo.setTitle("测试标题" + i);
            wxItemInfo.setContent("测试内容" + i);
            wxItemInfo.setTime(i + ":11");
            mList.add(wxItemInfo);
        }
        return mList;
    }
}

这里现在为了测试,所以做了假数据。现在是不是明白了一点呢?只要我们还有其他相关操作,就可以在接口中在定义一个该操作的方法,在WXModelImp中实现就可以了。

Presenter层

到这里是不是想到也要定义一个相关接口,以便实现相关方法,没错就是这样,实现的方法就是把ViewModel连接起来:

public interface WXPresent {
    void loadData();
}

定义一个类实现该接口,在其中引用ViewModel

public class WXPresentImp implements WXPresent{

    private WXModel mWXModle;
    private WXView mWXView;
    private List<WXItemInfo> mList;

    public WXPresentImp(WXView wxView) {
        mWXView = wxView;
        mWXModle = new WXModleImp();
    }

    @Override
    public void loadData() {
        mList = mWXModle.initData();
        mWXView.setData(mList);
    }

}

到这里基本的MVP就要结束了,最后只要在微信聊天界面实现View层的WXView接口在其中填充数据,实例化Presenter层的WXPresentImp类,调用其方法loadData()

public class WXFragment extends Fragment implements WXView{
    @InjectView(R.id.wx_recyclerView)
    RecyclerView wxRecyclerView;
    private WXAdapter wxAdapter;
    private WXPresentImp mWXPresentImp;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.wx_layout, null);
        ButterKnife.inject(this, view);
        wxAdapter = new WXAdapter(getContext());
        mWXPresentImp = new WXPresentImp(this);
        mWXPresentImp.loadData();
        wxRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        wxRecyclerView.addItemDecoration(new WXItemDecoration(getContext()));
        wxRecyclerView.setAdapter(wxAdapter);
        return view;
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.reset(this);
    }

    @Override
    public void setData(List<WXItemInfo> list) {
       wxAdapter.addData(list);
    }
}

到这里整个的微信聊天的MVP就完成了,回过去再整理下思路发现是不是清楚了很多。一旦你实现了MVP就是这么简单明了,思路清晰。后面项目的工程量大了,更加需要一个很好的模式了管理项目。所以还是值得推荐的。

效果图

图片描述

更多分享:https://idisfkj.github.io
项目地址:https://github.com/idisfkj/Hi...

关注

clipboard.png


午后一小憩
2.9k 声望838 粉丝