MVC和MVP

xiaoxiao2021-02-28  112

http://blog.csdn.net/yanbober/article/details/45645115 MVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。说了这么多,听着感觉很抽象,废话不多说,我们来看看MVC在Android开发中是怎么应用的吧!

MVC for Android 在Android开发中,比较流行的开发框架模式采用的是MVC框架模式,采用MVC模式的好处是便于UI界面部分的显示和业务逻辑,数据处理分开。那么Android项目中哪些代码来充当M,V,C角色呢?4

M层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。

V层:应用层中处理数据显示的部分,XML布局可以视为V层,显示Model层的数据结果。

C层:在Android中,Activity处理用户交互问题,因此可以认为Activity是控制器,Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。

MVC的优点: (1)耦合性低。所谓耦合性就是模块代码之间的关联程度。利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,所以耦合性低,减少模块代码之间的相互影响。 (2)可扩展性好。由于耦合性低,添加需求,扩展代码就可以减少修改之前的代码,降低bug的出现率。 (3)模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。

MVP 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责。为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Model-View-Presenter)模式应运而生。 在MVP模式里通常包含4个要素: (1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity); (2)View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试; (3)Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合); (4)Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

MVP与MVC的异同 MVC模式与MVP模式都作为用来分离UI层与业务层的一种开发模式被应用了很多年。在我们选择一种开发模式时,首先需要了解一下这种模式的利弊: 无论MVC或是MVP模式都不可避免地存在一个弊端: 额外的代码复杂度及学习成本。 这就导致了这两种开发模式也许并不是很小型应用。 但比起他们的优点,这点弊端基本可以忽略了: (1)降低耦合度 (2)模块职责划分明显 (3)利于测试驱动开发 (4)代码复用 (5)隐藏数据 (6)代码灵活性

MVC特点: 1.Controller: Activity(对应整个页面) + fragment(对应部分页面) 2.View: views(自定义view) + xml 3.Model: beans

控制器是view和model的桥梁,最重要。 Activity 控制 整个页面的layout Fragment 控制 部分页面的layout Holder 控制 一小分部view或者单个自定义view

MVP特点: 1.Presenter: MainActivityPresenter 2.View: MainActivity的addView(动态添加view) + xml 3.Model: beans + dao (本地缓存)

Presenter控制所有业务逻辑,Activity只展示界面。

谷歌市场 — 》 把业务有关的代码往父类抽取,减少控制器代码 百度外卖 —》 把与业务有关的代码往Presenter类抽取,每个模块独立,类似HmDownloadManager。

3.具体案例 //1.对javabean进行赋值 final User user=new User(); user.username=username; user.password=password; //2.开启子线程 new Thread(){ @Override public void run() { //3.执行业务逻辑 UserLoginNet net=new UserLoginNet(); if(net.sendUserLoginInfo(user)){ // 登陆成功 mMainActivity.success(); }else{ //登陆失败 mMainActivity.failed(); } } }.start(); }

转载请注明原文地址: https://www.6miu.com/read-56842.html

最新回复(0)