认识MVP模式

MVP 模式实际上指的是 Model-View-Presenter 主要的目的是为了划分各个模块的负责区域,分工明确,使代码清晰了很多。也是为了减少 Activity 中代码,使其没有那么臃肿,提高测试性,主要的分工如下:

View 主要是负责显示数据和与用户进行交互,这可以是一个 Activity 或者是一个 Fragment,一个 android.view.View 或者是一个 Dialog。

Model 是数据源层,负责对数据进行存储,检索之类的操作。

Present 是 View 和 Model 进行交互的中间桥梁,负责 Model 和 View 两者之间的处理,也就是说从Model中获取的数据然后传递给 View,起到一个中间人的作用,也是在 MVP 模式中处理复杂逻辑的地方,后台任务也是它负责的。

MVP它的具体数据流转是这样的:

android mvp 不实用 安卓mvp是什么_数据

实例讲解:登录界面,输入账号和密码,符合model层逻辑则Toast正确,否则提示错误。


android mvp 不实用 安卓mvp是什么_ide_02


















项目结构


android mvp 不实用 安卓mvp是什么_Text_03























从项目结构中可以看出,首先必须要有实体类bean,然后是model的接口和实例,里面便是业务类中实现的方法。还有就是view的接口和实例,里面负责UI的绘制和与用户的交互逻辑。最后便是presenter,作为model层与view的中间协调部分,通常与view和model的接口进行交互,负责两者之间的业务逻辑。


首先是实体类(用于set和get数据):


public class UserInfo {
    String userName;
    String pwd;

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }
}







model

在model中有一个业务的接口,用它的实例UserModel去继承它,并实现其方法:

public interface IUserModel {

void login(UserInfo userInfo);
}




为了能让点击登录后有提示,自定义一个Listener接口去监听它,并用presenter去继承实现方法,其逻辑代码如下:

public interface IUserListener {
    void loginListener( boolean status);
}

最后是model 层的实例,实现具体的数据层逻辑代码


public class UserModel implements IUserModel {
    String username;
    String pwd;
    private IUserListener userListener;

    public UserModel(IUserListener userListener) {
        this.userListener=userListener;
    }

    @Override
    public void login(UserInfo userInfo) {
        boolean status=false;
        username=userInfo.getUserName();
        pwd=userInfo.getPwd();
        //设置输入的username和pwd是否符合期望值,这里的数据可以是数据库,本地内存或网络数据
        if("sun".equals(username)&& "yu".equals(pwd)){
            status=true;
        }
        //传递status的布尔值给监听器IUserListener
        userListener.loginListener(status);

    }
}




view


view层和presenter层的交互一般都是通过接口实现的,在写view接口之前需要想一下要实现的功能有哪些。


view接口:


登录功能肯定需要用户名和密码:


String getUsername();
String getPwd();


重置功能:

void clearAll()


点击登录之后显示成功或失败的功能:


void showMessage(String message);


整合一下view接口代码就是:

public interface IUserView {
    String getUsername();
    String getPwd();
    void clearAll();
    void showMessage(String message);
}



view实现类


相关的布局和组件很简单,请大家自行脑补~~


public class UserActivity extends AppCompatActivity implements View.OnClickListener,IUserView {
    private EditText edt_username;
    private EditText edt_pwd;
    private Button btn_read;
    private Button btn_write;
    private Presenter presenter;
    @Override
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        presenter=new Presenter(this);
    }

    private void initView() {
        edt_username = (EditText) findViewById(R.id.edt_username);
        edt_pwd = (EditText) findViewById(R.id.edt_pwd);
        btn_read = (Button) findViewById(R.id.btn_read);
        btn_write = (Button) findViewById(R.id.btn_write);

        //点击事件
        btn_read.setOnClickListener(this);
        btn_write.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_read:
                presenter.login();//调用presenter的login()方法
                break;
            case R.id.btn_write:
                presenter.clear();//调用presenter的clear()方法
                break;
        }
    }
@Override public String getUsername() {
	//此处获取输入的值,后面在presenter里通过view接口调用该方法获取值
        return edt_username.getText().toString();

    }

    @Override
    public String getPwd() {
        return edt_pwd.getText().toString();
    }

    @Override
    public void clear() {
	//清空,后面再presenter里通过view接口调用该方法
        edt_username.setText("");
        edt_pwd.setText("");
    }

    @Override
    public void showMessage(String message) {
	//通过presenter实现自定义监听器的方法进行逻辑判断,而后调用view接口的showMessage方法,将message值传过来
        Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
    }
}

presenter

前面也提到了 Presenter 是View 和 Model 进行交互的中间桥梁这也要看你在你的代码里需要实现的是什么功能,在这里实现的登录和重置功能的实现以及点击登录后是否能成功登录出现的提示消息。

public class Presenter implements IUserListener{
    private IUserModel mUserModel;
    private IUserView mUserView;

    public Presenter(IUserView view) {
        this.mUserModel=new UserModel(this);
        this.mUserView=view;
    }

    public void login() {
        UserInfo userInfo=new UserInfo();
        userInfo.setUserName(mUserView.getUsername());
        userInfo.setPwd(mUserView.getPwd());
        mUserModel.login(userInfo);//view层与model层的间接交互
    }

    public void clear() {
        mUserView.clear();//若model层传递数据过来,可实现model层与view层间接交互
    }

    @Override
    public void loginListener(boolean status) {
        String Message;
        if(status){
            Message="登录成功";
        }else{
            Message="登录失败";
        }
        mUserView.showMessage(Message);
    }
}

Over!