分类: Android平台
2016-06-18 09:46:47
Model View
Controller简称MVC。一种业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。
l 视图层(View)
一般采用XML文件进行界面的描述,这些XML可以理解为AndroidApp的View。使用的时候可以非常方便的引入。同时便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。
l 控制层(Controller)
Android的控制层的重任通常落在了众多的Activity的肩上。这句话也就暗含了不要在Activity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Actiivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。使用Activity将View视图显示和Model模型数据处理隔离开。
l 模型层(Model)
针对业务模型,建立的数据结构和相关的类,就可以理解为AndroidApp的Model,Model是与View无关,而与业务相关的。对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。
在Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户 界面,并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。
MVP框架由3部分组成:View负责显示,Presenter负责逻辑处理,Model提供数据。
在MVP模式里通常包含3个要素(加上View interface是4个):
l View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity)
l Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合)
l Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。
l View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试
在MVP模式中,处理复杂逻辑的Presenter是通过interface与View(Activity)进行交互的,可以通过自定义类实现这个interface来模拟Activity的行为对Presenter进行单元测试。
MVP模式的优点:
l 在MVP中,Activity的代码不臃肿;
l 在MVP中,Model(IModel的实现类)的改动不会影响Activity(View),两者也互不干涉,而在MVC中会;
l 在MVP中,IView接口可以实现方便地对Presenter的测试;
l 在MVP中,Presenter可以用于多个视图,但是在MVC中的Activity就不行。
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.Presenter控制器
建立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 );
mUserrView .setFirstName (user .getFirstName ());//通过调用IUserView的方法来更新显示
mUserView .setLastName (user .getLastName ());
}
}
4.View视图
建立view(更新ui中的view状态),提供需要操作当前view的方法,也是接口
public interface IUserView {
int getID();
String getFristName();
String getLastName();
void setFirstName (String firstName);
void setLastName (String lastName);
}
5.UserActivity
UserActivity实现了IUserView及View.OnClickListener接口,同时有一个UserPresenter成员变量。
public class UserActivity extends Activity implements OnClickListener ,
IUserView {
private EditText mFirstNameEditText , mLastNameEditText , mIdEditText ;
private Button mSaveButton , mLoadButton ;
private UserPresenter mUserPresenter ;
......
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch ( v. getId()) {
case R .id .saveButton :
mUserPresenter .saveUser (getID (), getFristName (),
getLastName ());
break ;
case R .id .loadButton :
mUserPresenter .loadUser (getID ());
break ;
default :
break ;
}
}
}
View只负责处理与用户进行交互,并把数据相关的逻辑操作都扔给了Presenter去做。而Presenter调用Model处理完数据之后,再通过IUserView更新View显示的信息。
MVVM中的VM是ViewModel的缩写。ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModel和View之间的交互通过Data Binding完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力。
参考: