最近开始重写公司项目,决定采用MVP模式重构项目代码,对MVP模式进行一番学习,有一些收获与心得,和大家一起分享。
同一个功能用不同的代码方式去实现,编程的思路我认为非常重要,MVP模式就是一种编程思路。好的编程思路可以让代码层次分明,思路清晰,代码看起来也舒服,最重要的还
是易于维护和解决bug。
一、什么是MVP?
想必大家伙一定对MVC多少有了解一些,如果忘记了最好去复习一下,MVP其实就是MVC编程思想的一种演变。
M :Model 模型层
V :View 视图层
P :Presenter 主导器(控制器,差不多就是这个意思了)
Model主要数据的获取、处理、存储、删除等等,一句话,凡是涉及数据的处理全部放置在M层。
View主要就是负责数据的UI展示和更新,它只是展示,不做业务逻辑操作。
Presenter 主要起连接Model和View的作用。
注意:Model和View之间没有任何数据交互,全靠Presenter来传递,如下图
二、进一步理解MVP
1、其实Presenter不仅仅负责Model层和View层之间的数据传递,还负责具体业务逻辑操作的封装。Presenter才是起真正的主导作用。
2、View层(Activity),只做数据的显示和更新,当然还有View的初始化,事件的监听注册,使得Activty大大瘦身。做到了真正解耦,既显示与业务逻辑的分离。
3、既然是一种模式,那么对任何一个业务逻辑,代码层次应该都是差不多的,解析以一个新闻列表为例,对MVP编程模式进行最简单的说明,简单却十分重要。
一般来说MVP在实现一个模块功能时一般有6个类组成MVP模式(三个接口,三个实现类,其中view的实现类就是activity)。
M层 :
NewsModel接口
NewsModelImp实现类 实现了NewsModel接口中的方法
V层 :
NewsView接口
NewsActivity实现NewsView接口中的方法
P层:
NewsPresenter 接口
NewsPresenterImp实现类 实现了NewsPresenter接口中的方法
以下代码进做参考,主要还是为了理解MVP的编程思路
been实体类 具体看功能模块了
public class News { public String time;//新闻时间 public String content; //新闻内容 public News(String time,String content){ this.time = time; this.content = content; } }
M层接口
public interface NewsModel { List<News> getNews();//获取新闻列表 }M层实现类
public class NewsModelImp implements NewsModel { @Override public List<News> getNews() { return getDate();//模拟网络获取 } /** * 模拟网络获取信息列表 * @return */ public List<News> getDate(){ List<News> list = new ArrayList(); list.add(new News("2017-01-30","福州市软件园全区放假通知...")); list.add(new News("2017-02-16","厦门开通高架自行车道...")); return list; } }M层只涉及到数据(获取,解析...)------------------------------------------------------------------------P层接口public interface NewsPresenter { void showNewsList(); }
P层实现类public class NewsPresenterImp implements NewsPresenter { private NewsView newsView; private NewsModel newsModel; /** * 构造函数传入V 实例 M * @param newsView */ public NewsPresenterImp(NewsView newsView){ this.newsView = newsView; newsModel = new NewsModelImp(); }//决定业务处理的流程 @Override public void showNewsList() { List<News> list = newsModel.getNews();//先 调用M层获取新闻列表数据 newsView.showList(list);//再 调用V层 将新闻列表数据传入 } }P层获取
V层接口 只对UI进行显示或更新
public interface NewsView { void showList(List<News> list);//显示新闻列表 void showEnd(); //没有更多数据提示 }
V层实现类
public class NewsActivity extends AppCompatActivity implements NewsView{ private NewsPresenter presenter;//构造器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); presenter = new NewsPresenterImp(this);//实例构造器 initView(); initDate(); } private void initView(){ //适配实例化 listView控件初始化 设置适配器,简单忽略 } private void initDate(){ presenter.showNewsList();//控制器 调用了显示新闻列表的方法,具体的实现在M层,数据显示在就此activity }//数据显示 @Override public void showList(List<News> list) { // 适配器更新数据操作 比较简单就不写了 } @Override public void showEnd() { Toast.makeText(this,"没有更多数据了!!",Toast.LENGTH_SHORT).show(); } }三、总结M层:获取网络数据、操作数据、解析数据。
P层:有一个构造方法传入View的实例(主要还是要在activity中去执行某些事件而由P去控制业务逻辑的调用)
P控制逻辑的调用。
体现在:1、P层调用M层的方法对数据进行操作,2、P将获取M层的数据,并调用V层的方法更新界面。
V层:只做数据的展示,不直接获取数据,不处理数据,不做逻辑判断。
IT森,欢迎吐糟!!!