Android基础——框架模式MVC在安卓中的实践
本篇文章包含以下内容:
- MVC的介绍
- MVC的实践
MVC的介绍
MVC (Model View Controller),是模型(model)视图(view)控制器(controller)的缩写,一种软件设计模式,用于组织代码用一种功能模块和数据模块分离的方法
- Model:模型层,负责处理数据的加载或者存储
- View:视图层,负责界面数据的展示,与用户进行交互
- Controller:控制器层,负责逻辑业务的处理
MVC的模型关系图:
MVC设计执行的基本流程:
首先视图接受用户输入请求,然后将请求传递给控制器,控制器再调用某个模型来处理用户的请求,在控制器的控制下,再将处理后的结果交给某个视图进行格式化输出给用户。另外,View是可以直接访问Model来进行数据的处理的
对MVC的认识:
在MVC里,View是可以直接访问Model的。从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的
MVC优点:
- 耦合性低
- 重用性高
- 生命周期成本低
- 部署快
- 可维护性高
- 有利软件工程化管理
MVC缺点:
- 没有明确的定义
- 不适合小型,中等规模的应用程序
- 增加系统结构和实现的复杂性
- 视图与控制器间的过于紧密的连接
- 视图对模型数据的低效率访问
- 一般高级的界面工具或构造器不支持模式
MVC的实践
明白了MVC是什么之后,我们使用个小案例来深入了解
我们采用ListView来演示我们的MVC模式,目录结构:
实体类:包含了书的名字和图片信息
/**
* 作者:许英俊
* 实体类
* 对数据对象的封装
*/
public class Book {
//书名
private String name;
//书的图片
private int image;
public Book(String name, int image) {
this.name = name;
this.image = image;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
模型类(Model层):通常是对本地数据库的操作或者是通过网络请求获取网络数据的操作
我们在Model里面模拟了一个本地数据库,并提供了增删改查的方法
/**
* 作者:许英俊
* 模型层
* 对数据库的操作
*/
public class BookModel {
private static List<Book> list = new ArrayList<>();
/**
* 模拟本地数据库
*/
static {
list.add(new Book("Java从入门到精通", R.drawable.java));
list.add(new Book("Android从入门到精通", R.drawable.android));
list.add(new Book("Java从入门到精通", R.drawable.java));
list.add(new Book("Android从入门到精通", R.drawable.android));
}
/**
* 添加书本
* @param name
* @param image
*/
public void addBook(String name, int image) {
list.add(new Book(name, image));
}
/**
* 删除书本
*/
public void deleteBook( ) {
list.remove(list.size() - 1);
}
/**
* 查询数据库所有书本
* @return
*/
public List<Book> query() {
return list;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
控制器(Controller层):根据Model层的方法,加上我们的业务逻辑处理,对外提供方法并暴露接口
看delete这个方法,判断List是否为空(业务逻辑),使用mode.deleteBook()(Model层方法),通过listener.onComplete()(暴露接口)
/**
* 作者:许英俊
* 控制器层
* 处理业务逻辑,调用模型层的操作,并对外暴露接口
*/
public class BookController {
private BookModel mode;
public BookController() {
mode = new BookModel();
}
/**
* 添加书本
* @param listener
*/
public void add(onAddBookListener listener) {
mode.addBook("JavaWeb从入门到精通", R.drawable.javaweb);
if (listener != null) {
listener.onComplete();
}
}
/**
* 删除书本
* @param listener
*/
public void delete(onDeleteBookListener listener) {
if(mode.query().isEmpty()){
return;
}else{
mode.deleteBook();
}
if (listener != null) {
listener.onComplete();
}
}
/**
* 查询所有书本
* @return
*/
public List<Book> query() {
return mode.query();
}
/**
* 添加成功的回调接口
*/
public interface onAddBookListener {
void onComplete();
}
/**
* 删除成功的回调接口
*/
public interface onDeleteBookListener {
void onComplete();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
视图(View层):我们操作Controller获取List数据填充到ListView中,同时可以添加书本和删除书本
/**
* 作者:许英俊
* 视图层
* 发送输入请求给控制器
*/
public class BookActivity extends AppCompatActivity implements View.OnClickListener {
private BookController bookController;
private ListView lv_book;
private List<Book> list;
private BookAdapter adapter;
private Button bt_add, bt_delete;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);
lv_book = (ListView) findViewById(R.id.lv);
bt_add = (Button) findViewById(R.id.bt_add);
bt_delete = (Button) findViewById(R.id.bt_delete);
bt_add.setOnClickListener(this);
bt_delete.setOnClickListener(this);
bookController = new BookController();
list = bookController.query();
adapter = new BookAdapter(this, list);
lv_book.setAdapter(adapter);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//添加书本按钮
case R.id.bt_add:
bookController.add(new BookController.onAddBookListener() {
@Override
public void onComplete() {
adapter.notifyDataSetChanged();
}
});
break;
//删除书本按钮
case R.id.bt_delete:
bookController.delete(new BookController.onDeleteBookListener() {
@Override
public void onComplete() {
adapter.notifyDataSetChanged();
}
});
break;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
效果图
源码
Android基础——框架模式MVC在安卓中的实践的更多相关文章
- 框架模式MVC在安卓中的实践
我们采用ListView来演示我们的MVC模式,目录结构: 实体类:包含了书的名字和图片信息 public class Book { //书名 private String name; //书的图片 ...
- 基于RxJava2+Retrofit2精心打造的Android基础框架
代码地址如下:http://www.demodashi.com/demo/12132.html XSnow 基于RxJava2+Retrofit2精心打造的Android基础框架,包含网络.上传.下载 ...
- [转]框架模式 MVC 在Android中的使用
算来学习Android开发已有2年的历史了,在这2年的学习当中,基本掌握了Android的基础知识.越到后面的学习越感觉困难,一来是自认为android没啥可学的了(自认为的,其实还有很多知识科学), ...
- 框架模式 MVC 在Android中的使用
算来学习Android开发已有2年的历史了,在这2年的学习当中,基本掌握了Android的基础知识.越到后面的学习越感觉困难,一来是自认为android没啥可学的了(自认为的,其实还有很多知识科学), ...
- Android MVP框架模式
结合前一篇MVC框架模式 为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数据的可视化以及与用户的交互,同时让Model只关系数据的处理,基于MVC概念的MVP(Mode ...
- 基础4 Android基础
基础4 Android基础 1. Activity与Fragment的生命周期. Activity生命周期 打开应用 onCreate()->onStart()->onResume 按BA ...
- 一篇文章带你掌握主流基础框架——Spring
一篇文章带你掌握主流基础框架--Spring 这篇文章中我们将会介绍Spring的框架以及本体内容,包括核心容器,注解开发,AOP以及事务等内容 那么简单说明一下Spring的必要性: Spring技 ...
- SSH----MVC框架模式与分层架构
MVC框架模式 MVC框架模式是web开发中一种软件设计典范,他的全名是(Model -View -Controller),是模型(model)--视图(view)--控制器(controller)的 ...
- 简述MVC框架模式以及在你(Android)项目中的应用
标题是阿里电话面试的问题,一直以为自己很清楚MVC模式,结果被问到时,居然没法将MVC和Android中各个组件对应起来,所以,面试肯定挂了,不过面试也是学习的一种方式,可以知道大公司看中什么,以及自 ...
随机推荐
- FrameWork内核解析之XMS内核管理(一)上篇
阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680本篇文章将继续从以下两个内容来介绍XMS内核管理之AMS: [Activi ...
- 利用TKinter模块创建GUI窗口
# -*- coding: utf-8 -*- from Tkinter import * root = Tk() # 80x80代表了初始化时主窗口的大小,0,0代表了初始化时窗口所在的位置 ...
- bootstrap学习(三)表单
基本实例: from-group:可以是其内的标签排列更好 from-control:使标签宽度为100% <form> <div class="form-group&qu ...
- Puppeteer自动化测试cnode.js中文社区
如果完全不了解puppeteer的朋友可以去看看我的这篇随笔:https://www.cnblogs.com/zlforever-young/p/11569890.html 开始之前需要了解的知识:E ...
- 杭电多校第六场-J-Ridiculous Netizens
Problem Description Mr. Bread has a tree T with n vertices, labeled by 1,2,…,n. Each vertex of the t ...
- 转帖 eclipse Web项目WebContent目录修改
最近在做Web 项目时,新建了一个WEB 项目,如webdemo,eclipse默认的build路径为build,WEB-INF存放于WebContent下面,今改了一个build路径和WebCont ...
- bootstrapTable 分页插件
前端: @{ ViewBag.Title = "BootstrapTable 入门"; Layout = null; } <!-- 引入bootstrap样式 --> ...
- Dart编程实例 - Const 关键字
Dart编程实例 - Const 关键字 void main() { final v1 = 12; const v2 = 13; v2 = 12; } 本文转自:http://codingdict.c ...
- 排序+模拟+优先队列——cf1248E
其实是个模拟题.. /* 每个人都有一个口渴时间,如果口渴时,其前面没有人在排队,那么其就去排队接水,反之一直等到前面没有人排队 问每个人接完水的时间 每个没轮到的人都在位置上等前面的人接完水,然后他 ...
- Ext 消息框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...