所谓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均为例子:
将复杂的功能分割为各层内的小问题。各层内功能单一。这样易于功能修改拓展与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