MVP和MVC的区别

Posted by PanMin on May 10, 2018

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的优点:

  1. Model和View完全分离,我们可以修改View而不影响Model
  2. 可以更高效的使用Model,因为所有的交互都发生在一个地方–Persenter内部
  3. 我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑(一般视图的变化总是比model的变化频繁)
  4. 如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)

使用方法

  1. 建立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;
         }
     }
    
  2. 建立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
    	
     }
    
  3. 建立view接口(更新ui中的view状态),这里列出需要操作当前view的方法
     public interface IUserView {
         int getID();
         String getFristName();
         String getLastName();
         void setFirstName(String firstName);
         void setLastName(String lastName);
     }
    
  4. 建立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());
         }
     }