所谓MVP(Model-View-Presenter)模式。是将APP的结构分为三层:
view - UI显示层
view 层主要负责:
- 提供UI交互
- 在presenter的控制下修改UI。
-
将业务事件交由presenter处理。
注意. View层不存储数据,不与Model层交互。
presenter - 逻辑处理层
presenter 层主要负责:
- 对UI的各种业务事件进行相应处理。也许是与Model层交互,也许自己进行一些计算,也许控制后台Task,Servic
- 对各种订阅事件进行响应,修改UI。
-
临时存储页面相关数据。
注意. Presenter内不出现View引用。
model - 数据层
model层主要负责:
- 从网络,数据库,文件,传感器,第三方等数据源读写数据。
- 对外部的数据类型进行解析转换为APP内部数据交由上层处理。
- 对数据的临时存储,管理,协调上层数据请求。
如图示,里面的activity,presenter,model均为例子:

mvp
将复杂的功能分割为各层内的小问题。各层内功能单一。这样易于功能修改拓展与Debug。
解耦的设计,独立的模块,更有利于分工开发与测试。
简单例子如下
UserBean.java
package com.example.mvptest.com.example.bean;
/**
* Created by Administrator on 2016/6/2.
*/
public class UserBean {
private String mobile;
private String userpwd;
public UserBean(String mobile, String userpwd) {
this.mobile = mobile;
this.userpwd = userpwd;
}
public String getMobile() {
return mobile;
}
public String getUserpwd() {
return userpwd;
}
}
Model层
IUserModel.java和UserModel.java
public interface IUserModel {
void setID(int id);
void setMobile(String mobile);
void setUserPwd(String userpwd);
UserBean load(int id);
}
package com.example.mvptest.com.example.model;
import android.util.SparseArray;
import com.example.mvptest.com.example.bean.UserBean;
/**
* Created by Administrator on 2016/6/2.
*/
public class UserModel implements IUserModel {
private String usermobile;
private String userPwd;
private int mID;
private SparseArray<UserBean> mUserArray = new SparseArray<UserBean>();
@Override
public void setID(int id) {
mID = id;
}
@Override
public void setMobile(String mobile) {
usermobile = mobile;
}
@Override
public void setUserPwd(String userpwd) {
userPwd = userpwd;
UserBean userBean = new UserBean(usermobile, userpwd);
mUserArray.append(mID, userBean);
}
@Override
public UserBean load(int id) {
mID = id;
UserBean userBean = mUserArray.get(mID, new UserBean("no data", "not data"));
return userBean;
}
}
View层
package com.example.mvptest.com.example.view;
/**
* Created by Administrator on 2016/6/2.
*/
public interface IUserView {
int getID();
String getMobile();
String getUserPwd();
void setMobile(String mobile);
void setUserpwd(String userpwd);
}
Presenter层
package com.example.mvptest.com.example.presenter;
import com.example.mvptest.com.example.bean.UserBean;
import com.example.mvptest.com.example.model.IUserModel;
import com.example.mvptest.com.example.model.UserModel;
import com.example.mvptest.com.example.view.IUserView;
/**
* Created by Administrator on 2016/6/2.
*/
public class UserPresenter {
private IUserView mUserView;
private IUserModel mUserModel;
public UserPresenter(IUserView mUserView) {
this.mUserView = mUserView;
this.mUserModel = new UserModel();
}
public void saveUser(int id, String mobile, String userpwd) {
mUserModel.setID(id);
mUserModel.setMobile(mobile);
mUserModel.setUserPwd(userpwd);
}
public void loadUser(int id) {
UserBean user = mUserModel.load(id);
mUserView.setMobile("bb"+user.getMobile());
mUserView.setUserpwd(user.getUserpwd());
}
}
Activity层实现IUserView接口
public class MainActivity extends AppCompatActivity implements View.OnClickListener, IUserView{
private EditText mobileEdt, pwdEdt;
UserPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.save).setOnClickListener(this);
findViewById(R.id.load).setOnClickListener(this);
mobileEdt = (EditText) findViewById(R.id.mobile);
pwdEdt = (EditText) findViewById(R.id.passwd);
presenter = new UserPresenter(this);
}
@Override
public int getID() {
return 3;
}
@Override
public String getMobile() {
return mobileEdt.getText().toString();
}
@Override
public String getUserPwd() {
return pwdEdt.getText().toString();
}
@Override
public void setMobile(String mobile) {
mobileEdt.setText(mobile);
}
@Override
public void setUserpwd(String userpwd) {
pwdEdt.setText(userpwd);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.save:
presenter.saveUser(3, getMobile(), getUserPwd());
break;
case R.id.load:
presenter.loadUser(3);
break;
default:
break;
}
}
}
复杂例子:
https://github.com/wenhuaijun/SearchPictureTool