zoukankan      html  css  js  c++  java
  • MVC分层设计

    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)
    
    

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

  • 相关阅读:
    JS清除IE浏览器缓存的方法
    大数据基础2
    CI/CD
    手机连接fiddler
    npm run build 报错
    django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2
    读取ini文件的方法
    ES小知识
    svn连接pycharm
    创建python文件时添加相关信息
  • 原文地址:https://www.cnblogs.com/oaks/p/12203451.html
Copyright © 2011-2022 走看看