[Rails] 设计模式 MVC
使用 MVC 的Web开发框架有很多,比如 PHP 的 Zend,Python 的 Django 和 Golang 的 Beego。这篇文章主要介绍一下 MVC 的基本概念。
何为MVC
为了明确一个 Web Application 中各个部分的职责,我们人为规定三个层级:控制器(Controller),模型(Model)和视图(View),这是一种设计上的解耦。
为了直观地解释这三个层级的概念,我们假设这它们分别对应代码层面的三个类:
class FooModel
end
class FooView
end
class FooController
end
调度器(Controller) -- 完整的request生命周期
我们可以简单的理解为:用户在浏览器上输入的每个合法的URL,都将被映射到Controller类上的一个实例方法。该实例方法是一次request
的入口,负责调度程序的各个部分,返回 web response 给浏览器。
所谓入口,指的是一次访问的整个生命周期,都随着这个方法的开始而开始,结束而结束。从这个角度来看,我们完全可以不使用模型和视图,就能完成一个Web应用。
# Rails中URL和实例方法的映射关系在routes.rb中设置
# 比如 '/index' => Controller#index 可以规定:
# 当用户在browser中输入"http://yoursiteurl.com/index"时
# 执行Controller类的index方法
class FooController
def index
@counter = @counter ? @counter + 1 : 0
render html: "<p>你是该网站的第#{@counter}名访客</p>".html_safe
end
end
模型(Model) -- 数据持久化存储
我们可以看到,在一次request结束后,Controller实例方法中分配的内存会被回收,无法再次被使用。为了能够将Controller处理过程中的数据在今后继续使用,我们需要对这部分数据进行持久化存储。
所以我们期望有一个类,他的所有变量都永远不会消失。同时,我们还希望它可以提取对数据操作的逻辑(如例中的counter计数),方便今后复用。我们将它叫做模型(Model),至于它如何做到所有的变量永不消失,我们回头再讲。
class FooModel
# ...
def counter
@counter = @counter ? @counter + 1 : 0
save # 持久化存储,具体实现细节在后面的文章会讲
@counter
end
# ...
end
class FooController
def index
model = FooModel.new
render html: "<p>你是该网站的第#{model.counter}名访客</p>".html_safe
end
end
视图(View) -- 页面展示
在上面的两个例子中都出现了类似render html: xxx
之类的代码。如果我们不想在Controller中出现HTML代码,可以把它放在View层。
class FooModel
# ...
def counter
@counter = @counter ? @counter + 1 : 0
save # 持久化存储,具体实现细节在后面的文章会讲
@counter
end
# ...
end
class FooView
def index(counter)
"<p>你是该网站的第#{counter}名访客</p>"
end
end
class FooController
def index
model = FooModel.new
view = FooView.new
render html: view.index(model.counter).html_safe
end
end
小节
1. 调度器(Controller)对于一个程序来说是必须存在的,它负责得到输入,返回输出
2. 我们用模型(Model)这个概念来抽象调度器(Controller)中,关于数据存取、逻辑运算相关的代码,以便独立地维护它们。
3. 我们用视图(View)这个概念来抽象调度器(Controller)中,关于数据展示格式相关的代码,以便独立地维护它们。
[Rails] 设计模式 MVC的更多相关文章
- MySQL数据库(4)- 多表查询、可视化工具Navicat的使用、设计模式MVC
一.多表查询 准备工作:创建两张表,部门表(department).员工表(employee),代码和表格如下: # 创建表 create table department( id int, name ...
- 剖析 Rails 3 MVC 中的数据传递
引用链接:https://www.ibm.com/developerworks/cn/web/1108_linhx_rails3mvc/ 如果读者已经开发过基于 Rails 的应用,但对其 MVC 间 ...
- Dot Net设计模式—MVC模式
1 MVC设计模式简介 MVC结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离.MVC作为一种开发模型,通常用于分布式应用系统的设计和分析中,以及用于确定 ...
- iOS设计模式——MVC(Model-View-Controller)
Modol View Controller(MVC)是一种最早的也是最成功的可重用的设计模式,70年代的时候首次在smaltalk编写的程序中成功使用.基于MVC设计 模式,Cocoa整体架构可以划分 ...
- 学习笔记_Java_day12_设计模式MVC(13).JavaWeb的三层框架(14)
MVC 1. 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Contr ...
- js架构设计模式——MVC,MVP 和 MVVM 的图示及简单明了的区别说明
MVC,MVP 和 MVVM 的图示 复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理 ...
- 设计模式--MVC(C++版)
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型)-是应用程序中用于处理应用程序数据逻辑的部分.通常模型对象 ...
- 设计模式 --> MVC,MVP 和 MVVM 的图示
MVC,MVP 和 MVVM 的图示 复杂的软件必须有清晰合理的架构,否则无法开发和维护.MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用. 一.MVC M ...
- 设计模式——MVC MVP MVVM
了解到Vue是MVVM前端框架, 中午就研究了一下MVVM,但要从MVC开始说起: M(Model):模型,提供数据: V(View):视图,负责显示: C(Controller):控制器,负责逻辑处 ...
随机推荐
- 使用DBUnit实现对数据库的测试
这是一个JavaProject,有关DBUnit用法详见本文测试用例 首先是用到的实体类User.java package com.jadyer.model; public class User { ...
- ADO.NET—两种连接模式
一.ADO.NET简介 ADO.NET的名称起源于ADO(ActiveX Data Objects),这是一个广泛的类组,用于在以往的Microsoft技术中访问数据.用来访问数据库,.NET环境下首 ...
- phper談談最近重構代碼的感受(3)
这篇文章本来该和同一系列的文章一起写的,因为最近换工作的缘故滞后了.重构是非常细碎的叠加,有很多值得注意的地方. 1.消灭过多的临时变量. 有时候过多的无意义的临时变量,真心让人抓狂,特别是过了比较长 ...
- web打印小结
项目中有个需求是将winform客户端的打印,移到网页上由客户自行打印,打印要求是根据一定的格式实现套打. 当时的解决方案是使用PDF打印: 1. 准备好套打格式的底图: 2.打开底图,将动态内容画到 ...
- [ios] 微信订阅号: ios博文精选
晚上下班后时间充裕,平时要么看电视剧,要么玩游戏 感觉浪费时间. 最后决定自己也搞一个微信订阅号分享技术方面的东西,也提升自己. 如果大家也是一样情况,欢迎大家关注我的订阅号. 微信订阅号: ios ...
- Android JDK配置使支持Gradle更新,Maven安装
配置Maven 或执行Gradle更新等相关命令时出现以下错误时要重新配置JDK ERROR: JAVA_HOME is set to an invalid directory.JAVA_HOME = ...
- 关于 CentOS 自启动(服务、脚本)
/etc/init.d /etc/rc.local 其实是软连接,所以,实际上看 /etc/rc.d/ 这个文件夹就好了 rc.local 是自启动脚本 正常情况下,用户自定义的服务在 init.d ...
- [UWP小白日记-4]记账项目-2
手机端: 待续…… 哈哈这个代码真是好长时间啊,没办法萌新你们都懂的,UI是改了又改,知识也在慢慢积累, 所以这效率就低下了点 UI是改了又改,代码是不断了改,所以搞到现在都没开发完成
- WHAT?【 $.fn.extend() 】vs【 $.extend() 】
废话不多说,干货来了,转自http://www.cnblogs.com/hellman/p/4349777.html (function($){ $.fn.extend({ test:function ...
- nginx服务器上遇到了acces denied,报错是fastCGI只要好好修改配置就行了
猜想: 懵逼 实践: 首先通用的方法,并没有解决问题. 1.修改php-fpm配置文件vim /etc/php-fpm.d/www.confuser = nginx 编辑用户为nginx ...