所謂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