android MVP模式 编程思想(上)

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

 
 











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值