MVP和MVC的区别
MVP是从经典的模式MVC演变而来。
共同点:Controller/presenter负责逻辑的处理,Model提供数据,View负责显示。
区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter(MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过Controller。
在MVC中,View是可以直接访问Model的,从而,View中会包含Model的信息,不可避免的还要包括一些业务逻辑。Model不依赖View,但是View是依赖于Model的。
在MVP中,Presenter完全把Model和View进行了分离,主要的逻辑都在Presenter中实现。而且,Presenter与具体的View没有直接关联,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,也就是重用。如果要实现的UI比较复杂,而且相关的显示逻辑还跟Model有关系,就可以在View和Presenter之间防止一个Adapter。由这个Adapter来访问Model和View,避免两者之间的关联。
MVP的优点:
- Model和View完全分离,我们可以修改View而不影响Model
- 可以更高效的使用Model,因为所有的交互都发生在一个地方–Persenter内部
- 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑(一般视图的变化总是比model的变化频繁)
- 如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)
使用方法:
- 建立bean
public class UserBean { private String mFirstName; private String mLastName; public UserBean(String firstName, String lastName) { this. mFirstName = firstName; this. mLastName = lastName; } public String getFirstName() { return mFirstName; } public String getLastName() { return mLastName; } }
- 建立model接口(处理业务逻辑,这里指数据读写)
public interface IUserModel { void setID(int id); void setFirstName(String firstName); void setLastName(String lastName); int getID(); UserBean load(int id);// 通过id读取user信息,返回一个UserBean }
- 建立view接口(更新ui中的view状态),这里列出需要操作当前view的方法
public interface IUserView { int getID(); String getFristName(); String getLastName(); void setFirstName(String firstName); void setLastName(String lastName); }
- 建立presenter(主导器,通过iView和iModel接口操作model和view),activity可以把所有逻辑给presenter处理,这样java逻辑就从手机的activity中分离出来
public class UserPresenter { private IUserView mUserView; private IUserModel mUserModel; public UserPresenter(IUserView view) { mUserView = view; mUserModel = new UserModel(); } public void saveUser( int id, String firstName, String lastName) { mUserModel.setID(id); mUserModel.setFirstName(firstName); mUserModel.setLastName(lastName); } public void loadUser( int id) { UserBean user = mUserModel.load(id); mUserView.setFirstName(user.getFirstName()); // 通过调用IUserView的方法来更新显示 mUserView.setLastName(user.getLastName()); } }