MVC分层设计

什么是MVC?

MVC 是一种软件架构模式,利用分层的思想来设计交互式应用程序,由以下3层组成:

  • Model 业务模型层。
  • View 展示层。
  • Controller 控制层。

    MVC包含完整可供用户使用的程序。对于Web程序而言,MVC包含网页、后台处理程序、数据库等。

    Model 可以理解为一个函数,有输入和输出,比如训练好的决策树算法。给模型输入一个数据,它可以计算得到对应的结果,它是业务的载体;在spring 等常见的MVC框架中Model通常就是service

View 用来展示数据。常见的形式有:

  • 网页
  • Windows桌面窗口
  • 手机APP

交互式应用程序通常还是给人看的,所有要有一种展现形式表达它;通过View层来获取用户的输入以及展示Model的计算结果; 在spring 等常见的MVC框架中Model通常就是jsp/html等。

Controller 则负责处理交互事件,比如用户请求。用户在View触发的事件被捕获后,将事件代表的业务含义提交到对应的模型中处理,然后将模型的处理结果再返回给View层展示; 在spring 等常见的MVC框架中Controller 通常就Spring中的Controller, Spring 框架主要提供的就是Controller层的功能。

如何使用 MVC?

优势

相对于将代码全部写在一起的方式,使用MVC有两点重要优势:

  • 将复杂问题分解,便于实现。
  • 降低程序内部的耦合度,减少重构成本。

    分解问题后,更容易局部逻辑变的更加简单,适合处理复杂度比较高的业务;分层后各层使用接口通讯,只要维护接口不变就可以实现各层的替换。对于View层如果想增加一种展现形式或者替换只需要修改这一层就可以了,比如对于网页程序,想增加手机APP,那么只需要开发手机APP,而Model 层则可以复用。对于Controller 而言我们可以轻易将Spring框架替换成Struts等,而网页或者业务不用重写。

边界

边界就是哪层可以做的事情和不可以做的事情。以Spring框架为例,项目结构通常如下:

|-project
|-service
|-controller
|-bean
|-dao

其中MVC中的Model对应service,bean,dao目录,controller对应MVC中的controller。

  • controller层能做的事情

    • 接受http请求校验请求方法、数据大小等。
    • 写出响应结果
    • 根据请求url路由对应的service方法,也就是model
  • model层能做的事情
    • 业务处理。
    • 业务的参数校验。

以银行的取钱业务为例,在业务层实现取钱的逻辑,我们可能要定义一个方法:

def withdraw(卡号,密码,金额):
pass

接着在这个方法体里校验密码是否正确、余额是否充足,这些参数的类型可能正确,但是不一定合法,这个区别于controller层的参数校验,那个是校验是验证参数是否符合接口定义,比如定义了一个age必须是int类型,传了一个字符串就要报错,接着在controller中定义url、请求的方法、参数的名称类型如下:

def handle_withdraw(http_req):
content = http_req.content # 获取http报文体
card_no = content.get("card_no")
passwd = content.get("passwd")
amount = content.get("amount")
# 调用业务方法
withdraw(card_no, passwd, amount)

当我们更换服务的协议时候,业务方法是不必重写的,我们只需要写一个新的接受请求事件的控制层,由http更换为mq,新写一个控制层如下:

def listen(evet):
content = evet.msg # 获取http报文体
card_no = content.get("card_no")
passwd = content.get("passwd")
amount = content.get("amount")
# 调用业务方法
withdraw(card_no, passwd, amount)

这样可以当公司规模变化在架构演进过程中复用代码,降低重构的代价。

MVC分层设计的更多相关文章

  1. java web基础之mvc模式设计(一)--使用httpservlet实现mvc分层设计,DAO层使用的是dbutils实现与数据库的链接

    一:1.最终的实现效果图: 2.案例的目录结构: 3.案例中使用到的jar包: 二:案例的链接数据库的层次结构关系:数据库是:mysql ,数据库名字:dsm,表格名字:customers 数据库表格 ...

  2. ABP分层设计

    ABP分层设计 一.为什么要分层 分层架构是所有架构的鼻祖,分层的作用就是隔离,不过,我们有时候有个误解,就是把层和程序集对应起来,就比如简单三层架构中,在你的解决方案中,一般会有三个程序集项目:XX ...

  3. JavaWeb单体项目的分层设计与实现

    1.概述 为什么要把一个完整的项目(Project)按层拆分成多个模块(Module)? 1)使项目层次更加的清晰: 2)提高代码的复用性: 3)细化分工: 4)解耦. 是不是听起来很高大尚,今天就简 ...

  4. servlet jsp jdbc bootstrarp mvc分层模式实现的第一个项目

    登录注册界面 这是一个注册和登录的界面 用到了前端页面中自带的一点H5的标签和属性---巩固下 邮箱格式 :type="email"  不能为空:  required=" ...

  5. 初识mvc分层思想

    首先要清楚的是: mvc是一种设计模式,一种分层思想,没有具体的技术与之对应,无论是js还是java或者其他的技术都可以运用. 既然是分层那么这些层都有哪些职责呢? View层(界面层): 为用户展示 ...

  6. Web自动化框架之五一套完整demo的点点滴滴(excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试报告+对接缺陷管理系统+自动编译部署环境+自动验证false、error案例)

    标题很大,想说的很多,不知道从那开始~~直接步入正题吧 个人也是由于公司的人员的现状和项目的特殊情况,今年年中后开始折腾web自动化这块:整这个原因很简单,就是想能让自己偷点懒.也让减轻一点同事的苦力 ...

  7. 传统ASP.NET开发和MVC的设计思想

    传统ASP.NET开发 第一步:客户端请求服务器: 第二步:服务器从数据库取得数据处理后响应给客户端页面. MVC的设计思想 第一步:客户端请求控制器(里面的一个方法): 第二步:控制器从数据库里取得 ...

  8. Javaweb学习笔记--分层设计

    在早期的JavaWeb应用中,JSP文件负责处理业务逻辑,控制网页流程并创建HTML页面,JSP文件是一个独立的,能自主完成所有任务的模块, 这带来了一系列问题:HTML代码和Java程序代码强耦合在 ...

  9. robot framework 使用四:分层设计和截图以及注意事项

    再说一下眼下的主要环境信息和版本号: 操作系统:win7 64位 python版本号:2.7.6 RIDE版本号:1.2.3 selenium2library:1.5.0 selenium:2.40. ...

随机推荐

  1. 5W随想

    什么时候都要想5个W:what.where.when.why.who 比如:提bug的时候:这个问题是什么问题,在哪里发现的,什么时候发现的/什么时候修复好,怎么发现的/为什么是bug,谁发现的/指给 ...

  2. kerberos系列之hdfs&yarn认证配置

    一.安装hadoop 1.解压安装包重命名安装目录 [root@cluster2_host1 data]# tar -zxvf hadoop-2.7.1.tar.gz -C /usr/local/ [ ...

  3. Swift 4.0 数组(Array)之过滤器(filter)的使用

    我们先来定义一个常量整型数组 let array = [5, 4, 3, 1, 2] 过滤器(filter)使用之筛选出大于3的值 let resultArray = array.filter { ( ...

  4. 开源项目OEIP 游戏引擎与音视频多媒体(UE4/Unity3D)

    现开源一个项目 OEIP 项目实现的功能Demo展示 这个项目演示了在UE4中,接入摄像机通过OEIP直接输出到UE4纹理上,并直接把UE4里的RenderTarget当做输入源通过OEIP里GPU管 ...

  5. [剑指Offer]41.和为S的两个数字 VS 和为S的连续正数序列

    [剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of ...

  6. angualrjs 总结 随记(三)

    $sanitize和$sce服务的使用方法 $sanitize会把标签的属性都移除,以及绑定在元素上的事件.仅保留了标签和内容 $q服务的使用1. 创建一个Service,去服务器读取数据: 2. 在 ...

  7. Redis源码分析: String(SDS)容量调整分析

    整体思路: 1 惰性缩容.不释放空间,留给到期释放等机制释放. 2 加倍扩容.在需要空间达1M之前按新空间两倍分配空间,否则按新空间大小+1M分配.注意,1M=1024*1024*Char.Char可 ...

  8. 第十五周java实验作业

    实验十五  GUI编程练习与应用程序部署 实验时间 2018-12-6 1.实验目的与要求 (1) 掌握Java应用程序的打包操作: Java程序的打包,程序编译完成后,程序员将.class文件压缩打 ...

  9. GitHub 热点速览 Vol.13:近 40k star 计算机论文项目再霸 GitHub Trending 榜

    作者:HelloGitHub-小鱼干 摘要:"潮流是个轮回",这句话用来形容上周的 GitHub Trending 最贴切不过.无论是已经获得近 40k 的高星项目 Papers ...

  10. 自动驾驶研究回顾:CVPR 2019摘要

    我们相信开发自动驾驶技术是我们这个时代最大的工程挑战之一,行业和研究团体之间的合作将扮演重要角色.由于这个原因,我们一直在通过参加学术会议,以及最近推出的自动驾驶数据集和基于语义地图的3D对象检测的K ...