zoukankan      html  css  js  c++  java
  • 四、MVC简介

    • 一、高内聚、低耦合

        大学的时候,上过一门叫《软件工程》的课程,课程中讲到了耦合,解耦等相关的词汇,当时很懵懂,不解其意。

        耦合:是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象,其实就是两个体系之间的藕断丝连。其实在现实生活中藕断丝连也未必不是一件好事。但在软件系   统中两个体系之间关系过于复杂,就需要更多维护和管理的成本。因此当我们在开发一个系统的时候,都尽可能的降低各个模块之间的耦合度。

        解耦:就是解除两个体系间的耦合关系,但绝对的0耦合也是没法做的,但我们可以通过一些方法尽量去减少体系之间的耦合。

        内聚:是一个模块内部各成分之间相关联程度的度量。其实内聚还有很多的类型,但实质都是一样的,都是内部关系。

        高内聚、低耦合:高内聚,就是内部为了某一个目标,某一个关注点,一致的共同努力去完成。低耦合就是降低外部模块间的耦合。模块之间低耦合,模块内部高内聚。一个系统有多个模块组成,在  划分模块时,要把功能关系紧密的放到一个模块中(高内聚),功能关系远的放到其它模块中。模块之间的联系越少越好,接口越简单越好(低耦合,细线通信)。如果划分的模块之间接口很复杂,说明功能划分得不太合理,模块之间的耦合太高了,同时也说明某模块的内聚也不高。

    • 二、架构和模式

       架构和模式:应该是一个属于相互涵盖的过程,但是总体来说Architecture更加关注的是所谓的High-Level Design,而模式关注的重点在于通过经验提取的“准则或指导方案”在设计中的应用。在不同的层面上,模式提供不同层面的指导。根据处理问题的粒度不同,从高到低,模式分为3个层次:架构模式(Architectural Pattern)、设计模式(Design Pattern)、实现模式(Implementation Pattern).架构模式是模式中的最高层次,描述软件系统里的基本的结构组织或纲要,通常提供一组事先定义好的子系统,指定它们的责任,并给出把它们组织在一起的法则和指南。比如,用户和文件系统安全策略模型,N-层结构,组件对象服务等,我们熟知的MVC结构也属于架构模式的层次。一个架构模式常常可以分解成很多个设计模式的联合使用。设计模式是模式中的第二层次,用来处理程序设计中反复出现的问题。例如,GOF总结的23个基本设计模式——Factory Pattern, Observer Pattern等等。实现模式是最低也是最具体的层次,处理具体到编程语言的问题。比如,类名,变量名,函数名的命名规则;异常处理的规则等等。

        上段落介绍文字看上去很专业,只是想说明,架构和模式不是同一个概念,确实一个涵盖的过程。

    • 三、MVC架构

                 此处出处:http://www.cnblogs.com/diyunfei/p/6752618.html

         MVC的全名是Model View Controller,是模型(model)视图(view)控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。

                 MVC开始是存在于桌面程序中的,M是指业务模型,V是指用户界面,C则是控制器。使用的MVC的目的:在于将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。比如Windows系统资源管理器文件夹内容的显示方式,下面两张图中左边为详细信息显示方式,右边为中等图标显示方式,文件的内容并没有改变,改变的是显示的方式。不管用户使用何种类型的显示方式,文件的内容并没有改变,达到M和V分离的目的。

     

     

    在网页当中,V即View视图是指用户看到并与之交互的界面。比如由html元素组成的网页界面,或者软件的客户端界面。MVC的好处之一在于它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,它只是作为一种输出数据并允许用户操纵的方式。

     M即model模型是指模型表示业务规则。在MVC的三个部件中,模型拥有最多的处理任务。被模型返回的数据是中立的,模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。

     C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

     

    下图说明了三者之间的调用关系。

     

     

    用户首先在界面中进行人机交互,然后请求发送到控制器,控制器根据请求类型和请求的指令发送到相应的模型,模型可以与数据库进行交互,进行增删改查操作,完成之后,根据业务的逻辑选择相应的视图进行显示,此时用户获得此次交互的反馈信息,用户可以进行下一步交互,如此循环。

    MVC举例一:

    最典型的MVC就是jsp+servlet+javabean模式。

    JavaBean作为模型,既可以作为数据模型来封装业务数据,又可以作为业务逻辑模型来包含应用的业务操作。其中,数据模型用来存储或传递业务数据,而业务逻辑模型接收到控制器传过来的模型更新请求后,执行特定的业务逻辑处理,然后返回相应的执行结果。

    JSP作为表现层,负责提供页面为用户展示数据,提供相应的表单(Form)来用于用户的请求,并在适当的时候(点击按钮)向控制器发出请求来请求模型进行更新。

    Serlvet作为控制器,用来接收用户提交的请求,然后获取请求中的数据,将之转换为业务模型需要的数据模型,然后调用业务模型相应的业务方法进行更新,同时根据业务执行结果来选择要返回的视图。

    MVC举例二:

    Struts2框架:Struts2是基于MVC的轻量级的web应用框架。Struts2的应用范围是Web应用,注重将Web应用领域的日常工作和常见问题抽象化,提供一个平台帮助快速的完成Web应用开发。基于Struts2开发的Web应用自然就能实现MVC,Struts2着力于在MVC的各个部分为开发提供相应帮助。

    下面通过代码来简单解释一下:

    Login.html

     

     

    Login.java

     

     

    Struts.xml

     

     

    用户首先在Login.html中输入用户名和密码,点击登陆,此时根据action的路径,在struts.xml中找到对应的Login,然后根据对应的class的路径进入相应的login.Java,在这里判断之后,返回success或error,然后根据struts.xml中的result值,指向相应的jsp页面。

     

     

    控制器——filterdispatcher

    从上面这张图来看,用户请求首先到达前端控制器FilterDispatcher。FilterDispatcher负责根据用户提交的URL和struts.xml中的配置,来选择合适的动作(Action),让这个Action来处理用户的请求。FilterDispatcher其实是一个过滤器(Filter,servlet规范中的一种web组件),它是Struts2核心包里已经做好的类,不需要我们去开发,只是要在项目的web.xml中配置一下即可。FilterDispatcher体现了J2EE核心设计模式中的前端控制器模式。

    动作——Action

    在用户请求经过FilterDispatcher之后,被分发到了合适的动作Action对象。Action负责把用户请求中的参数组装成合适的数据模型,并调用相应的业务逻辑进行真正的功能处理,获取下一个视图展示所需要的数据。Struts2的Action,相比于别的web框架的动作处理,它实现了与Servlet API的解耦,使得Action里面不需要再直接去引用和使用HttpServletRequest与HttpServletResponse等接口。因而使得Action的单元测试更加简单,而且强大的类型转换也使得我们少做了很多重复的工作。

    视图——Result

    视图结果用来把动作中获取到的数据展现给用户。在Struts2中有多种优秀的结果展示方式,常规的jsp,模板freemarker、velocity,还有各种其它专业的展示方式,如图表jfreechart、报表JasperReports、将XML转化为HTML的XSLT等等。而且各种视图结果在同一个工程里面可以混合出现。

    MVC举例三:

    ASP.NET MVC

    在visual studio当中新建一个ASP.NET MVC web应用程序,

     

     

    新建完成之后,创建的项目当中即有controllers,models和views,体现了MVC的编程思想。

     

    • 四、MVC优缺点

     MVC的优点:

    1.耦合性

    视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

    2.重用性高

    MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,因为多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),比如,用户可以通过电脑也可通过手机来订购某样产品,虽然订购的方式不一样,但处理订购产品的方式是一样的。由于模型返回的数据没有进行格式化,所以同样的构件能被不同的界面使用。

    3.部署快,生命周期成本低

    MVC使开发和维护用户接口的技术含量降低。使用MVC模式使开发时间得到相当大的缩减,它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

    4.可维护性高

    分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。

    MVC的缺点:

    1.完全理解MVC比较复杂。

    由于MVC模式提出的时间不长,加上同学们的实践经验不足,所以完全理解并掌握MVC不是一个很容易的过程。

    2.调试困难。

    因为模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难,每个构件在使用之前都需要经过彻底的测试。

    3.不适合小型,中等规模的应用程序

    在一个中小型的应用程序中,强制性的使用MVC进行开发,往往会花费大量时间,并且不能体现MVC的优势,同时会使开发变得繁琐。

    4.增加系统结构和实现的复杂性

    对于简单的界面,严格遵循MVC,使模型、视图与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

    5.视图与控制器间的过于紧密的连接并且降低了视图对模型数据的访问

    视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。

    依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。

  • 相关阅读:
    解决Mac连接移动硬盘为只读状态 转载: https://blog.csdn.net/adsl624153/article/details/99094809
    一文读懂Python web框架和web服务器之间的关系 转载:https://mp.weixin.qq.com/s/xgZ6ZkARrhtId0kBdbmgNA
    用 Python 登录主流网站 转载:https://mp.weixin.qq.com/s/QqYAXTxj2gK0ehXfpdNrOA
    k8s 面试题
    postman 转载:https://mp.weixin.qq.com/s/GscJGcR-2luk5N5Z7797dw
    Scrapy 如何正确 Post 发送 JSON 数据 转载:https://mp.weixin.qq.com/s/sy8pi9CdIRNEgCMgdJH87Q
    vgpu
    scray cookiejar
    登录接口的设计 转载:https://mp.weixin.qq.com/s/n44yNet6VtQsj4XDQJkeKA
    3D旋转图片、视频
  • 原文地址:https://www.cnblogs.com/alone-striver/p/7745141.html
Copyright © 2011-2022 走看看