Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397328
  • 博文数量: 78
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 940
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-25 09:39
文章分类

全部博文(78)

文章存档

2016年(7)

2015年(1)

2014年(35)

2013年(35)

我的朋友

分类: Android平台

2016-06-18 09:46:47

MVC设计架构

Model View Controller简称MVC。一种业务逻辑、数据、界面显示分离的方法组织代码,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。

Android中的MVC

l  视图层(View)

一般采用XML文件进行界面的描述,这些XML可以理解为AndroidAppView。使用的时候可以非常方便的引入。同时便于后期界面的修改。逻辑中与界面对应的id不变化则代码不用修改,大大增强了代码的可维护性。

l  控制层(Controller)

Android的控制层的重任通常落在了众多的Activity的肩上。这句话也就暗含了不要在Activity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Actiivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。使用ActivityView视图显示和Model模型数据处理隔离开。

l  模型层(Model)

针对业务模型,建立的数据结构和相关的类,就可以理解为AndroidAppModelModel是与View无关,而与业务相关的。对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。

MVC的缺点

Android开发中,Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户 界面,并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,Activity类的职责不断增加,以致变得庞大臃肿。

MVP设计架构

MVP框架由3部分组成:View负责显示,Presenter负责逻辑处理,Model提供数据。


MVP模式里通常包含3个要素(加上View interface4个):

l  View:负责绘制UI元素、与用户进行交互(Android中体现为Activity)

l  Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合)

l  Presenter:作为ViewModel交互的中间纽带,处理与用户交互的负责逻辑。

l  View interface:需要View实现的接口,View通过View interfacePresenter进行交互,降低耦合,方便进行单元测试

MVP模式中,处理复杂逻辑的Presenter是通过interfaceView(Activity)进行交互的,可以通过自定义类实现这个interface来模拟Activity的行为对Presenter进行单元测试。

MVP模式的优点:

l  MVP中,Activity的代码不臃肿;

l  MVP中,Model(IModel的实现类)的改动不会影响Activity(View),两者也互不干涉,而在MVC中会;

l  MVP中,IView接口可以实现方便地对Presenter的测试;

l  MVP中,Presenter可以用于多个视图,但是在MVC中的Activity就不行。

 

MVP代码实例

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(主导器,通过iViewiModel接口操作modelview),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实现了IUserViewView.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

MVVM中的VMViewModel的缩写。ViewModel可以理解成是View的数据模型和Presenter的合体,ViewModelView之间的交互通过Data Binding完成,而Data Binding可以实现双向的交互,这就使得视图和控制层之间的耦合程度进一步降低,关注点分离更为彻底,同时减轻了Activity的压力。


参考:

阅读(1604) | 评论(0) | 转发(0) |
0

上一篇:RxJava响应式异步编程

下一篇:没有了

给主人留下些什么吧!~~