首页 > 技术文章 > @Android MVP 设计模式

chenxibobo 2017-03-13 17:57 原文

为什么需要MVP

关于什么是MVP,以及MVC、MVP、MVVM有什么区别,这类问题网上已经有很多的讲解,你可以自行搜索或看看文末的参考文章,这里就只讲讲为什么需要MVP。 
Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,并接受并处理来自用户的操作请求,进而作出响应。但是,随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致很容易变得庞大而臃肿。 
越小的类,bug越不容易出现,越容易调试,更容易测试,我相信这一点大家是都赞同的。在MVP模式下,View和Model是完全分离没有任何直接关联的(比如你在View层中完全不需要导Model的包,也不应该去关联它们)。 
使用MVP模式能够更方便的帮助Activity(或Fragment)职责分离,减小类体积,使项目结构更加清晰。

MVC和MVP到底有什么区别呢?

 这里写图片描述

 

 

从这幅图可以看到,我们可以看到在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。

AndroidMVP使用示例

首先需要定义一个View层接口,让View实现类Activity(Fragment)实现; 
其次需要定义一个Presenter实现接口,让Presenter实现类实现; 
在View实现类Activity(Fragment)中包含Presenter对象,并在Presenter创建的时候传一个View对象;
在Presenter中通过构造时传入的视图层对象操作View

从M开始

UserModel.Class

public class UserModel {
    public ILoginPresenter mILoginPresenter;

    public UserModel(ILoginPresenter presenter) {
        this.mILoginPresenter = presenter;
    }
    
    public void getServerLogon(String username, String password){
        int state=0;
        mILoginPresenter.responeLogin(state);
    }

}

接下来是V

ILoginView.Class

public interface ILoginView {
     void loginSuccess(int state);
}

LoginActivity.Class

public class LoginActivity extends AppCompatActivity implements ILoginView, View.OnClickListener {

    private EditText usernameEdit, passwrodEdit;
    private Button loginButton;
    private LoginPersenter loginPresenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mvplogin);
        usernameEdit = (EditText) findViewById(R.id.et_username);
        passwrodEdit = (EditText) findViewById(R.id.et_username);
        loginButton = (Button) findViewById(R.id.bt_login);
        loginButton.setOnClickListener(this);
        loginPresenter = new LoginPersenter(this);
    }

    @Override
    public void loginSuccess(int state) {
        Toast.makeText(this, "login success", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bt_login:
            loginPresenter.requestLogin(usernameEdit.getText().toString(), passwrodEdit.getText().toString()); break; } } }

最后就是P了

ILoginPresenter.Class

public interface ILoginPresenter {
     void responeLogin(int state);
}

LoginPresenter.Class

public class LoginPersenter implements ILoginPresenter {
    public UserModel mUserModel;
    public ILoginView mILoginView;


    public LoginPersenter(ILoginView view) {
        mILoginView=view;
        mUserModel = new UserModel(this);
    }

    public void requestLogin(String username, String password){
        mUserModel.getServerLogon(username,password);
    }
    
    @Override
    public void responeLogin(int state) {
        mILoginView.loginSuccess(state);
    }

}

Android MVP存在的问题

1.在实际开发当中,由于团队之间很难做到密切配合,所以view往往是很难服用的。不用强求复用View


2. 例如当应用进入后台且内存不足的时候,系统是会回收这个Activity的。通常我们都知道要用OnSaveInstanceState()去保存状态,用OnRestoreInstanceState()去恢复状态。 在生命周期处理好Persenter的相关判断。


3.Persenter不参与Android生命周期处理起来会简单一些。

 

推荐阅读