前言
为了巩固一下自己对mvp架构的理解,于是突生一个想法,用mvp架构来实现一点类似于微信的功能。所以就有了现在的标题高仿微信之mvp实现。希望自己在实现的过程中能熟练掌握mvp架构的精髓,同时我也在这写下自己在这过程中的成长与所思。该片文章为第一系列,以后会根据自己的进度来写下剩余的系列。还没接触的也可以一起来学习下,当然如有不对的欢迎来指教。
MVP
首先我来简单的解释下何为mvp
- M就是Model ,这里主要负责的就是业务处理,数据的获取,例如数据库的读写,http的网络数据的处理。
- V就是View ,顾名思义视图的意思,这里主要的任务就是处理各个界面ui控件的处理。
- P就是Presenter ,控制器,这里负责的是Model与View之间的联系操作。
那么他们之间到底是如何联系在一起工作的呢?当一个界面被创建时首先调用View,View调用Presenter中的相应操作,在Presenter中则调用了Model的数据操作方法,Presenter中获得数据时,则反过来调用View中接口传回给View层。这样就简单的实现了MVP中的合作流程。这样做的一个明显的好处就是把数据操作与主界面分离,完全隔离数据操作,使得各个功能实现模块化,降低他们之间的耦合性,只要命名合理就能迅速明白该方法的作用。下面以该项目为例。
本来想以主框架为例的,但主框架目前没有Model层,所以下面以微信中的第一个聊天微信窗口为例,用MVP来实现
View层
当我们打开微信聊天界面时,要先调用设置数据的方法所以我们可以定义一个接口,其中实现设置数据的方法:
1 2 3
| public interface WXView { void setData(List<WXItemInfo> list); }
|
相信大家一看方法名就能很好理解该方法要做的操作了
Model层
既然该层是实现对数据的操作,自然我们也可以定义一个接口,实现加载数据的方法:
1 2 3
| public interface WXModel { List<WXItemInfo> initData(); }
|
定义完之后我们再定义一个类实现该接口,进行数据的加载;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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层
到这里是不是想到也要定义一个相关接口,以便实现相关方法,没错就是这样,实现的方法就是把View与Model连接起来:
1 2 3
| public interface WXPresent { void loadData(); }
|
定义一个类实现该接口,在其中引用View与Model:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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();
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 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://github.com/idisfkj/HightCopyWX
转载请指明出处 idisfkj博客:https://idisfkj.github.io