MVC

原文地址 → MVC | The story of Captain,转载请注明出处。

MVC模式 (Model–View–Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)视图(View)控制器(Controller)

MVC模式 的目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的 重复利用 成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。

MVC 简介

  • 模型(Model): 用于 封装与应用程序的业务逻辑相关的数据 以及 对数据的处理方法。Model 有对数据直接访问的权力,Model 不依赖 View 和 Controller,也就是说, Model 不关心它会被如何显示或是如何被操作。
  • 视图(View)负责格式化显示数据,Controller 会有一个机制将处理的结果 (可能是 Model, 集合或是状态等) 交给 View,然后由 View 来决定怎么显示。
  • 控制器(Controller)起到不同层面间的桥梁组织作用,用于控制应用程序的流程。它处理事件并作出响应。事件 包括用户的行为和数据 Model 上的改变。

MVC 优点

  • 表现与数据的分离: View 表现层 负责数据的展示于数据的获取,Model 数据层负责数据的储存与数据的运算,Controller 控制层负责处理信息,在表现层与数据层之间起传输作用,控制流程的走向。三个模块进行分离,各司其职、分而治之,模块功能责任明确,有高度解耦之效,提高开发效率。
  • 代码的高重复利用率: 多个 View 可以使用一个 Model,多个 View 与 Model 之间可以使用一个 Controller 进行通信,因为功能模块的分离使得代码重复利用率大大提升。
  • 提升项目的生命周期: 因为高度的去耦合,在后期的维护与升级上可以做到快速高效,模块之间互不影响,延长了项目的生命周期。

应用软件的不同功能可以不止有一个 MVC,A 功能可以有 i 个 Model、j 个 View、k 个 Controller,B 功能同样也是。站在不同功能的角度,每个功能都拆分为 MVC,站在整个软件架构角度也是拆分为 MVC,因此 MVC 更容易实现一个项目的管理划分。

以下内容摘自维基百科

MVC 模式在概念上强调 Model、View、Controller 的分离,各个模块也遵循着由 Controller 负责处理消息Model 负责处理数据View 负责数据展示 的职责分离原则负责各自的功能。MVC 可以从根本上强制性地将数据层和表现层分开,尽管构造 MVC 模式需要一些额外的工作,但是它带给我们的好处是毋庸置疑的。 首先,多个 View 能共享一个 Model 。如今,同一个Web应用程序会提供多种用户界面,例如用户希望既能够通过浏览器来收发电子邮件,还希望通过手机来访问电子邮箱,这就要求Web网站同时能提供Internet界面和WAP界面。在MVC设计模式中, Model 响应用户请求并返回响应数据,View 负责格式化数据并把它们呈现给用户,业务逻辑和表示层分离,同一个 Model 可以被不同的 View 重用,所以大大提高了代码的可重用性。

其次,Controller 是自包含(self-contained)指高独立内聚的对象,与 Model 和 View 保持相对独立,所以可以方便的改变应用程序的数据层和业务规则。例如,把数据库从MySQL移植到Oracle,或者把RDBMS数据源改变成LDAP数据源,只需改变 Model 即可。一旦正确地实现了控制器,不管数据来自数据库还是LDAP服务器,View 都会正确地显示它们。由于MVC模式的三个模块相互独立,改变其中一个不会影响其他两个,所以依据这种设计思想能构造良好的少互扰性的构件。

此外,Controller 提高了应用程序的灵活性和可配置性。Controller 可以用来连接不同的 Model 和 View 去完成用户的需求,也可以构造应用程序提供强有力的手段。给定一些可重用的 Model 、 View 和Controller 可以根据用户的需求选择适当的 Model 进行处理,然后选择适当的的 View 将处理结果显示给用户。

因为 MVC 模式强调职责分离,所以在发展 MVC 应用时会产生很多文件,MVC 模式要求开发者以更高的构架(Application Architecture)导向思维来进一步思考应用程序的设计,而非用大杂烩的方式开发撰写应用程序,对于应用程序的生命周期以及后续的可扩充与可维护性而言有相当正面的帮助。另外,MVC 职责分离也带来了一个现代软件工程要求的重要特性:可测试性 (Testability),MVC-based 的应用程序在良好的职责分离的设计下,各个部分可进行独立的单元测试,有利于与企业内的自动化测试、持续集成 (Continuous Integration) 与持续发行 (Continuous Delivery) 的流程集成,减少应用程序改版部署所需的时间。

对于一个刚入门的初学者来说,架构导向的思考会有一定的门槛,需要较多的实现与练习才能具备相应的能力,大多数的初学者还是较习惯于大杂烩式的程序撰写,所以可能会对 MVC 模式抱持着排斥或厌恶的心态,然而 MVC (或是其他的Design Patterns) 都是有助于应用程序长远的发展,虽然大杂烩式的程序也可以用来发展长生命周期的应用程序,但是相较于 MVC,大杂烩式的程序在可扩充性和可维护性 (尤其是可测试性) 上会远比 MVC 复杂很多,相反的,MVC 模式的应用程序是在初始开发时期必须先思考并使用软件架构,使得开发时期会需要花较多心力,但是一旦应用程序完成后,可扩充性、可维护性和可测试性反而会因为 MVC 的特性而变得容易。

MVC 模式在已有众多优秀 Framework 的现代,早就已经没有不适合小型应用的问题,小型的应用还是可以由 MVC Framework 的应用来获取 MVC 的优点,同时它也能作为未来小型应用扩充到大型应用时的基础。若一开始就想要做大型应用,那么 MVC 模式的职责分离以及要求开发的架构思考会更适合大型应用的开发。

MVC 在 JavaScript 中的应用示例

以下以 JavaScript 为例,演示 MVC 模型:

// View 负责展示数据
let View = {
    init: function () { 
        this.renderData = (msg) => alert(msg); 
    }
};
// Model 负责存储数据
let Model = {
    init: function () {
        this.data = 'Hello world!';
    }
};
// Controller 负责 Model 和 View 之间的通信
let Controller = {
    init: function () {
        Model.init();
        View.init();
        this.handleMessage();
    },
    handleMessage: () => View.renderData(Model.data);
};
// 利用 Controller.init() 进行整个功能的初始化,启动整个功能
Controller.init();
复制代码

日常生活中的 MVC 实例

在日常生活中也有很多能够映射出 MVC 的例子,例如我们常用的电脑就可以拆分为 MVC:

  • Model:电脑的硬盘、CPU、显卡、各个单片机等,负责数据的存储与运算。
  • View:显示器,负责与用户交互,展示数据信息。
  • Controller:鼠标与键盘,负责传达事件,用户使用键盘输入字符,使用鼠标点击屏幕,捕获到该事件后,Model(处理器) 将 View(屏幕) 的数据进行存储并进行运算,最终结果又会展示到 View(屏幕)上。

每个模块之间互不影响,键盘坏了可以换键盘(Controller),鼠标坏了换鼠标(Controller),显示器坏了换显示器(View),内存不够用了再加内存条(Model)等等,充分体现了 MVC 的模块化分离思想。

更多精彩文章,请点击 → The story of Captain

转载于:https://juejin.im/post/5a68b62cf265da3e4c07f805

在刚刚步入“多层结构”Web应用程序开发的时候,我阅读过几篇关于“asp.net三层结构开发”的文章。但其多半都是对PetShop3.0和Duwamish7的局部剖析或者是学习笔记。对“三层结构”通体分析的学术文章几乎没有。 2005年2月11日,Bincess BBS彬月论坛开始试运行。不久之后,我写了一篇题目为《浅谈“三层结构”原理与用意》的文章。旧版文章以彬月论坛程序中的部分代码举例,通过全局视角阐述了什么是“三层结构”的开发模式?为什么要这样做?怎样做?……而在这篇文章的新作中,配合这篇文章我写了7个程序实例(TraceLWord1~TraceLWord7留言板)以帮助读者理解“三层结构”应用程序。这些程序示例可以在随带的CodePackage目录中找到——   对于那些有丰富经验的Web应用程序开发人员,他们认为文章写的通俗易懂,很值得一读。可是对于asp.net初学者,特别是没有任何开发经验的人,文章阅读起来就感到非常困难,不知文章所云。甚至有些读者对“三层结构”的认识更模糊了……   关于“多层结构”开发模式,存在这样一种争议:一部分学者认为“多层结构”与“面向对象的程序设计思想”有着非常紧密的联系。而另外一部分学者却认为二者之间并无直接联系。写作这篇文章并不是要终结这种争议,其行文目的是希望读者能够明白:在使用asp.net进行Web应用程序开发时,实现“多层结构”开发模式的方法、原理及用意。要顺利的阅读这篇文章,希望读者能对“面向对象的程序设计思想”有一定深度的认识,最好能懂一些“设计模式”的知识。如果你并不了解前面这些,那么这篇文章可能并不适合你现在阅读。不过,无论这篇文章面对的读者是谁,我都会尽量将文章写好。我希望这篇文章能成为学习“三层结构”设计思想的经典文章!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值