android MVP模式 编程思想(上)

来源:互联网 发布:淘宝怎看同行退款率 编辑:程序博客网 时间:2024/05/21 17:03

最近开始重写公司项目,决定采用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森,欢迎吐糟!!!











1 0