初识MVP模式

Android MVP 模式:当项目越来越庞大、复杂,参与的研发人员越来越多的时候,MVP 模式的优势就充分显示出来了。

    MVP模式是MVC模式在Android上的一种升级版本,要介绍MVP就得先介绍MVC。在MVC模式中,Activity应该是属于View这一层。而实质上,它既承担了View,同时也包含一些Controller的东西在里面。这对于开发与维护来说不太友好,耦合度大高了。把Activity的View和Controller抽离出来就变成了View和Presenter,这就是MVP模式

MVC模式: 

    MVC模式的结构分为三部分,实体层的Model,视图层的View,以及控制层的Controller。其中View层其实就是程序的UI界面,用于向用户展示数据以及接收用户的输入;Model层就是JavaBean实体类,用于保存实例数据;Controller控制器用于更新UI界面和数据实例。

MVP模式:

    在Android项目中,Activity和Fragment占据了大部分的开发工作。如果有一种设计模式(或者说代码结构)专门是为优化Activity和Fragment的代码而产生的,你说这种模式重要不?这就是MVP设计模式。

按照MVC的分层,Activity和Fragment(后面只说Activity)应该属于View层,用于展示UI界面,以及接收用户的输入,此外还要承担一些生命周期的工作。Activity是在Android开发中充当非常重要的角色,特别是TA的生命周期的功能,所以开发的时候我们经常把一些业务逻辑直接写在Activity里面,这非常直观方便,代价就是Activity会越来越臃肿,超过1000行代码是常有的事,而且如果是一些可以通用的业务逻辑(比如用户登录),写在具体的Activity里就意味着这个逻辑不能复用了。如果有进行代码重构经验的人,看到1000+行的类肯定会有所顾虑。因此,Activity不仅承担了View的角色,还承担了一部分的Controller角色,这样一来V和C就耦合在一起了,虽然这样写方便,但是如果业务调整的话,要维护起来就难了,而且在一个臃肿的Activity类查找业务逻辑的代码也会非常蛋疼,所以看起来有必要在Activity中,把View和Controller抽离开来,而这就是MVP模式的工作了。

MVP模式的核心思想:

    MVP把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model类还是原来的Model

    这就是MVP模式,现在这样的话,Activity的工作的简单了,只用来响应生命周期,其他工作都丢到Presenter中去完成。从上图可以看出,Presenter是Model和View之间的桥梁,为了让结构变得更加简单,View并不能直接对Model进行操作,这也是MVP与MVC最大的不同之处。

MVP模式的作用:

  • 1、分离了视图逻辑和业务逻辑,降低了耦合;

  • 2、Activity只处理生命周期的任务,代码变得更加简洁;

  • 3、视图逻辑和业务逻辑分别抽象到了View和Presenter的接口中去,提高代码的可阅读性;

  • 4、Presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试;

  • 5、把业务逻辑抽到Presenter中去,避免后台线程引用着Activity导致Activity的资源无法被系统回收从而引起内存泄露和OOM。

  • MVP Demo:

  • 1、MyApplcation

import android.app.Application;

import org.xutils.x;

public class MyApplcation extends Application{

    @Override
    public void onCreate() {
        super.onCreate();
        //Xutils的初始化
        x.Ext.init(this);
    }
}
2、model层:
http:
public class URLConstant {
    /**
     * 首页列表URL
     */
    public static final String MAIN_LIST_URL = "http://www.1688wan.com/majax.action?method=getGiftList";
}
IMainModel:
public interface IMainModel {

    void queryList(int pageno, Callback callback);
    String getName();
}
MainModel:
public class MainModel implements IMainModel{

    /**
     * 请求列表数据
     * @param pageno
     */
    public void queryList(int pageno,final ,Callback callback) {
        RequestParams requestParams = new RequestParams(URLConstant.MAIN_LIST_URL);
        requestParams.addBodyParameter("pageno",pageno+"");
        x.http().post(requestParams, new Callback.CommonCallback() {
            @Override
            public void onSuccess(String result) {
                LogUtils.log(MainModel.class,result);
                Gson gson = new Gson();
                GiftBean giftBean = gson.fromJson(result, GiftBean.class);
                if (callback != null) {
                    callback.success(giftBean);
                }
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });
    }

    public String getName() {
        return "zhangsan";
    }
Presenter层:
 
  
Callback:
public interface Callback {

    void success(GiftBean giftBean);
}

IMainPresenter:
public interface IMainPresenter {

    void queryList(int pageno);
}

MainPresenter:
public class MainPresenter implements Callback,IMainPresenter{

    private IMainModel mainModel;
    private IMainView mainView;

    public MainPresenter(IMainView mainView) {
        this.mainView = mainView;
        this.mainModel = new Main2Model();
    }

    public void queryList(int pageno) {
        this.mainModel.queryList(pageno,this);
    }

    @Override
    public void success(GiftBean giftBean) {
        String name = this.mainModel.getName();
        if (name != null) {
            this.mainView.setResult(giftBean);
        }
    }

//    public interface Callback{
//        void success(GiftBean giftBean);
//    }
}

}

View层:
IMainView:
public interface IMainView {

    void setResult(GiftBean giftBean) ;
}
MainActivity:
public class MainActivity extends AppCompatActivity implements IMainView{

    private IMainPresenter mainPresenter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mainPresenter = new MainPresenter(this);
        //加载数据
        mainPresenter.queryList(1);
    }

    @Override
    public void setResult(GiftBean giftBean) {
        LogUtils.log(MainActivity.class,giftBean.getList().get(0).getGiftname());
    }
}

这只是一个简单的MVP Demo后续会加入第三方框架依赖注入,使MVP结构更清晰,敬请关注!




你可能感兴趣的:(初识MVP模式)