Android:MVC模式(下)
在上一篇文章中,我们将 View 类单独出来并完成了设计和编写。这次我们将完成 Model 类,并通过 Controller 将两者连接起来,完成这个计算器程序。
模型(Model)就是程序中封装了数据,并定义了操作和处理这些数据的逻辑的对象。在计算器的例子中,就是处理输入的操作数和运算符,并计算返回结果。Let’s Go
(注意:示例中直接使用 double 类型来处理数据,但严格来说很多语言的浮点数计算都是不精确的)
一,设计模型的接口
在程序构建之初,我们首先考虑的应该是各模块间的封装和扩展,设计好模块的接口,然后再实现模块的细节,最后把模块组合起来构成整个程序。这就是面向接口编程的概念。
思考一下 Model 类,它主要实现三个功能,1,接受操作数输入;2,接受运算符输入并返回计算结果;3,重置。这些功能主要都是被外部使用的,所以基于此来设计接口,对其它类而言,只需知道该接口定义了什么方法然后使用就行,而不需要了解实现细节。
创建 com.test.interfaces 包,并右键选择 New -> Interface 创建一个名为 ICalculator 的接口(一般接口命名都以大写字母 I 开头)
创建 com.test.model 包,并创建 CalModel 类,同时实现 ICalculator 接口。
二,通过栈和递归函数实现计算器算法
计算器的计算规则很简单,从左到右计算,不考虑运算符的优先级,例如:2 + 1 * 2 - 3,相当于: (((2 + 1) * 2) - 3) = 3;这样保证编写的简易性。
我们知道,栈是一种后进先出的数据结构,我们通过一个栈 dataStack 记录输入的运算数和操作符。如图所示:
所谓的递归函数,就是接受有限的自然数,通过重复调用自身,最终得到一个自然数结果的函数。算法的核心就是设计这样一个递归函数 popOpOffStack 来对 dataStack 进行求解,过程如图:
三,编写程序
按上面的思路,popOpOffStack 可以单独写出,并不需要实例化后才能使用,所以将 popOpOffStack 设为 CalModel 的静态方法则可,如图:
完成编写后,可以构建一个栈来测试一下,因为返回的是 double 类型,所以结果是 3.0,如图:
核心算法完成后,完成对运算数和操作符的输入的处理并补充其它细节。这样我们的 CalModel 就完成了。
四,通过Controller将Model和View连接
在 Android 的文档中,Activity 是被推荐作为 Controller 的角色,负责视图和模型的协调、沟通。而从 Activity 所拥有的功能的角度看,也是最合适的选择。至此,代码结构也清晰了。MainActivity 将作为 Controller 协调视图和模型,并对一些数据及细节进行处理。其代码如下:
通过 MainActivity 将模型和视图连接起来后,我们的计算器也最终完成了。可以运行测试一下。
五,结束及回答
本次要点:
1)通过 MVC 设计,使计算器程序有了较好的扩展和维护能力,假如使用另一种计算器算法,只需创建另一实现 ICalculator 接口的 Model 类,并代替原来的 CalMode 则可。当需要增加功能时,可以将代码增加到对应的模块处而不用随意写在一起。
2)这次只介绍了最基本的 MVC 知识,而至于 MVC 模式更高级的使用以及模块间的通信会在后面再讲。从代码的编写中,大家可能会发现 MainActivity 其实很难进行抽象,因为都是一些连接的逻辑和细碎代码。这也就是为什么 MVC 概念提出这么久以来,Model 和 View 的封装技术有了长足进步,而 Controller 却没什么突破的原因之一。作为前端,这方面大家可以对比一下现时流行起来的 MVC 库,对 Controller 角色的处理。而苹果在 Cocoa 中对 Controller 的封装也是很有特色,有机会会介绍对比一下。
3)例子中的细节处理还可以处理得更好,就留给大家修改。另外,有时间的话可以尝试使用经典的双栈算法来实现这个计算器,替换 CalModel 类。
在上几篇文章中大家提到的問题在这里总结回答一下:
1)什么时候用回调和 MVC 的设计为什么可以提高维护和扩展性:对于前者,当我们设计一个模块时,模块除提供方法外,自身发生的事是需要被外界了解时,或外界对这个模块发生的事是“渴望”得知的,这个时候就需要进行回调处理了。对于后者,在这次的文章中讲得比也较清晰了。
2)创建工程时,为什么会多出一些 support-v4、 support-v7 等这些包,这是 Android 的一些高级 API 或组件为在低版本中向下兼容实现而自动加载到工程中的,对自身程序并没有什么影响。
本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6693724.html,如需转载请自行联系原作者
Android:MVC模式(下)相关推荐
- Android MVC模式
Android MVC模式 [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/51172105 前些天看到 ...
- MVC模式下My97DatePicker日期控件引用注意事项
My97DatePicker日期控件之前在用webform模式开发的时候,只要 <script language="javascript" type="text/j ...
- android返回后屏幕旋转了,Android recovery 模式下屏幕显示旋转
Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...
- Android AP模式下获取SSID/PASSWORD(反射机制
Android AP模式下获取SSID/PASSWORD 1.public staticvoidreflect(Objectobj) { if (obj == null) { return; } Fi ...
- Android AP模式下获取SSID/PASSWORD
Android AP模式下获取SSID/PASSWORD(反射机制) 1.test.java文件 WifiManager mWifiManager = (WifiManager) getSystemS ...
- 【案例分享】使用ActiveReports报表工具,在.NET MVC模式下动态创建报表
提起报表,大家会觉得即熟悉又陌生,好像常常在工作中使用,又似乎无法准确描述报表.今天我们来一起了解一下什么是报表,报表的结构.构成元素,以及为什么需要报表. 什么是报表 简单的说:报表就是通过表格.图 ...
- 基于MVC模式下的二手车拍卖平台设计
课程名称:<软件体系结构与设计模式> 实验项目名称:基于MVC模式下的二手车拍卖平台设计 实验内容 按下列要求编写程序并上机调试运行: 拍卖系统要又三个显示界面,分别是车体图片,文字描述和 ...
- Android recovery 模式下屏幕显示旋转
Android recovery 模式下屏幕显示旋转 大家在网上搜索 Android屏幕旋转,成千上万的文章,但是没有几个是写recovery 模式的.难道你们只旋转正常模式下的屏幕方向,不管reco ...
- Android MVC模式在android系统中的体现
在前一段时间学习android中总是听到mvc模式,但是却不是很清楚,不过现在有了初步的了解,那么mvc的体现如下: mvc应该是M.V.C,就是指数据模型,视图,控制器: 1) 模型层(Model) ...
最新文章
- postman 使用_如何使用Postman实现数据驱动?
- JAVA构造器的实际使用
- mlx rdma网卡指标参数简介
- 2019年末逆向复习系列之今日头条WEB端_signature、as、cp参数逆向分析
- matlab 大于并且小于,Matlab:将大于(小于)1(-1)的元素转换为1(-1)的序列
- linux-stat查属
- 『计算机视觉』Mask-RCNN_训练网络其一:数据集与Dataset类
- 采用AOP 的观点来 Log 所有方法的调用
- Boss说:你要是能搞懂这六个分布式技术栈,我给你薪资翻倍
- mx250显卡天梯图_mx250显卡天梯图_2020年最新笔记本显卡天梯图,看看你的显卡排在哪!...
- java链接打印机打印文件
- 白话说大数据算法C4.5
- c语言网络套接字讲解,C语言学习笔记-网络与套接字
- 在php中phr是什么意思,phr. 相当多的_____
- 任意文件读取与下载漏洞学习
- ps,pr,3Dmax软件使用经验
- 一文了解RT8059GJ5
- 十只老鼠和一千瓶毒药的故事
- 最强整理:Java开发究竟该如何学习,大厂面经合集
- Java中单点登录的实现——类似QQ“顶号”操作