热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

JAVA基础:MVC减少编程复杂性

JAVA基础:MVC减少编程复杂性--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
  MVC

  随着面向对象的语言(如Java)的迅速发展和普及,越来越多的编程人员开始在应用开发中使用这些语言。然而原有的开发语言(即面向操作的开发语言如C++等)在短时间内还不可能退出历史舞台,因此现在就出现了面向对象的语言和传统的面向操作的语言共存的局面。在设计应用中同时使用两类不同的语言(混合语言设计)比过去只使用一类语言会带来许多新的问题,其中复杂性就是混合语言设计中最经常遇到的问题。下面我们探讨混合语言设计中可能导致复杂性增加的地方,以及如何减少以至消除这些复杂性。

  复杂性

  复杂性是应用开发过程中最令人头疼的一个问题。每当在一个应用中增加一个功能时,它的复杂性通常呈几何级的增长。这种复杂性往往导致程序的开发无法再继续下去。这也是现在为什么许多应用只有Beta版本而没有正式版的原因。

  专家将应用开发过程产生的复杂性分为两类,即非本质的(accidental)和本质的(essential)。本质的复杂性是对于解决目标问题所必然产生的复杂性,非本质的复杂性是由于选择了不适当的开发工具和设计工具而产生的复杂性。对于一个功能确定的程序来讲,本质的复杂性是确定的,而非本质的复杂性则是没有限制的。因此,一个应用的开发要想较顺利地取得成功,就需要尽可能地减少非本质的复杂性。

  OOD的特点

  面向对象的设计(OOD)将一个程序分解成根据具体的对象而设计的一系列元素。这些具体对象的行为和数据以一种叫做“类(class)”的编程单元进行打包。应用程序创建一个或多个这些类的例示,也称为“对象(object)”。类的行为是通过创建对象之间的关系组合在一起的。

  OOD允许开发者用两种主要的方法来控制复杂性的增加。第一,OOD定义严格的出口语义,这允许开发者隐藏实现的细节,并且明确说明什么方法是其它的对象可以访问的。这个信息隐藏使得可以对大部分的代码进行修改而不影响其它的对象。

  第二,OOD将对象之间的关系分为四类:继承、包容、使用和协调。适当地使用这些关系可以大大减少应用开发过程中本质的和非本质的复杂性。如,继承是产生面向对象设计中可再使用的主要因素。这个再使用性是通过代码共享和多态性获得的。这种再使用可以大大减少应用的本质的复杂性。包容允许一个类的用户在使用包容器时忽略被包容的类(class)。这个简化使设计者能够大大减少应用的非本质的复杂性。

  可视化接口在OOD方面的不足

  许多程序都需要可视化接口,这些接口由对话框、选单、工具条等组成。这些可视化接口的增加会引进OOD设计的不足,使得一个好的面向对象的设计走向反面。可视化接口有三个属性可能会给应用开发带来麻烦。

  第一,可视化接口提高了传统的面向操作的拓扑结构。用户产生接口事件,如开关按键和列表框选择等,受到程序的一个模块的驱动并且用来对静态的数据进行操作。在设计中将这面向操作的拓扑结构同一个面向对象的设计混合在一起将导致对象之间的大量的杂合。

  第二,用户接口通常对于同样的信息经常会需要许多不同的显示。如,一个客户选择列表框可以包含一个客户的名字和电话号码以及许多其它客户的名字。

  当用户选择某个特定的客户后,他/她的名字和电话号码及其它全部相关的信息都会详细地显示出来。

  除此之外,一个简单的程序可能具有不同的用户接口。如一个银行账户系统有一个接口用于出纳员来访问账户平衡、存款和取款,而监督者的接口则包含另外的信息并加上账号管理的功能。这些不同的接口很容易导致类的扩展。

  最后,可视化接口在整个设计阶段还会进行较大的改变。这些改变包括完全重新安排用户与系统的交互操作等。可视化接口的这些改变即使在最好的设计中也会增加应用开发的复杂性。

  MVC弥补可视化接口/OOD的不足

  模型/界面/控制器(Model/View/Controller,MVC)编程技术允许一个开发者将一个可视化接口连接到一个面向对象的设计中,而同时还可以避免我们上面讨论的几个问题。MVC最初是为Smalltalk语言而设计的。MVC通过创建下面三个层将面向对象的设计与可视化接口分开:

  模型(Model):模型包含完成任务所需要的所有的行为和数据。模型一般由许多类组成并且使用面向对象的技术来创建满足五个设计目标的程序。

  界面(View):一个界面就是一个程序的可视化元素,如对话框、选单、工具条等。界面显示从模型中提供的数据,它并不控制数据或提供除显示外的其它行为。一个单一的程序或模型一般有两种界面行为。

  控制器(Controller):控制器将模型映射到界面中。控制器处理用户的输入,每个界面有一个控制器。它是一个接收用户输入、创建或修改适当的模型对象并且将修改在界面中体现出来的状态机。控制器在需要时还负责创建其它的界面和控制器。

  控制器一直决定哪些界面和模型组件应该在某个给定的时刻是活动的,它一直负责接收和处理用户的输入,来自用户输入的任何变化都被从控制器送到模型。

  界面从模型内的对象中显示数据。这些对象的改变可以通过也可以不通过用户的交互操作来完成。如:在一个Web浏览器中负责接收页面的对象收集和装配栈中的信息,必须有某种方式来让这些对象通知界面数据已经被改变了。在模型变化时有两种方法来对界面进行更新。

  在第一种方法中,界面可以告诉模型它正在监视哪些对象。当这些对象中有任何一个发生变化时,一个信息就被发送给界面。界面接收这些信息并且相应地进行更新。为了避免我们上面讨论的不足,模型必须能够不用修改就支持许多种不同的界面显示。

  第二个方法并不直接将界面连接到模型中,它的控制器负责在模型变化时更新界面。控制器通过对模型对象或观察器方法进行监测来检测模型中的变化。这个方法不用了解界面的模型知识,因此界面就变成是可以跨应用使用的。

  使用MVC的优点

  MVC通过以下三种方式消除与用户接口和面向对象的设计有关的绝大部分困难:

  第一,控制器通过一个状态机跟踪和处理面向操作的用户事件。这允许控制器在必要时创建和破坏来自模型的对象,并且将面向操作的拓扑结构与面向对象的设计隔离开来。这个隔离有助于防止面向对象的设计走向反面。

  第二,MVC将用户接口与面向对象的模型分开。这允许同样的模型不用修改就可使用许多不同的界面显示方式。除此之外,如果模型更新由控制器完成,那么界面就可以跨应用再使用。

  最后,MVC允许应用的用户接口进行大的变化而不影响模型。每个用户接口的变化将只需要对控制器进行修改,但是既然控制器包含很少的实际行为,它是很容易修改的。

  面向对象的设计人员在将一个可视化接口添加到一个面向对象的设计中时必须非常小心,因为可视化接口的面向操作的拓扑结构可以大大增加设计的复杂性。

  MVC设计允许一个开发者将一个好的面向对象的设计与用户接口隔离开来,允许在同样的模型中容易地使用多个接口,并且允许在实现阶段对接口作大的修改而不需要对相应的模型进行修改。
推荐阅读
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • docker增加restart=always, docker重启后自动启动容器的方法
    本文介绍了在运行docker容器时如何添加参数来保证每次docker服务重启后容器也自动重启的方法,以及如何使用命令来更新已启动的容器。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 处理docker容器时间和宿主机时间不一致问题的方法
    本文介绍了处理docker容器时间和宿主机时间不一致问题的方法,包括复制主机的localtime到容器、处理报错情况以及重启容器的步骤。通过这些方法,可以解决docker容器时间和宿主机时间不一致的问题。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Java的集合及其实现类,包括数据结构、抽象类和具体实现类的关系,详细介绍了List接口及其实现类ArrayList的基本操作和特点。文章通过提供相关参考文档和链接,帮助读者更好地理解和使用Java的集合类。 ... [详细]
  • 本文介绍了电流源并联合并的方法,以及谐振电路的原理。谐振电路具有很强的选频能力,通过将电感和电容连接在一起,电流和电压会产生震荡。谐振频率的大小取决于电感和电容的大小,而电路中的电阻会逐渐降低震荡的幅度。电阻和电容组成的电路中,当电容放完电后,电阻两端的电压为0,电流不再流过电容。然而,电感是一种特殊的器件,当有电流流过时,线圈会产生感应磁场,阻止电流的流动,从而使电流不会减小。 ... [详细]
  • 标题: ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
author-avatar
叶小丹丶丶01_520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有