使用 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的更多相关文章

  1. MySQL数据库(4)- 多表查询、可视化工具Navicat的使用、设计模式MVC

    一.多表查询 准备工作:创建两张表,部门表(department).员工表(employee),代码和表格如下: # 创建表 create table department( id int, name ...

  2. 剖析 Rails 3 MVC 中的数据传递

    引用链接:https://www.ibm.com/developerworks/cn/web/1108_linhx_rails3mvc/ 如果读者已经开发过基于 Rails 的应用,但对其 MVC 间 ...

  3. Dot Net设计模式—MVC模式

    1 MVC设计模式简介 MVC结构是为那些需要为同样的数据提供多个视图的应用程序而设计的,它很好的实现了数据层与表示层的分离.MVC作为一种开发模型,通常用于分布式应用系统的设计和分析中,以及用于确定 ...

  4. iOS设计模式——MVC(Model-View-Controller)

    Modol View Controller(MVC)是一种最早的也是最成功的可重用的设计模式,70年代的时候首次在smaltalk编写的程序中成功使用.基于MVC设计 模式,Cocoa整体架构可以划分 ...

  5. 学习笔记_Java_day12_设计模式MVC(13).JavaWeb的三层框架(14)

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

  6. js架构设计模式——MVC,MVP 和 MVVM 的图示及简单明了的区别说明

    MVC,MVP 和 MVVM 的图示 复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身很容易理 ...

  7. 设计模式--MVC(C++版)

    MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式.这种模式用于应用程序的分层开发. Model(模型)-是应用程序中用于处理应用程序数据逻辑的部分.通常模型对象 ...

  8. 设计模式 --> MVC,MVP 和 MVVM 的图示

    MVC,MVP 和 MVVM 的图示 复杂的软件必须有清晰合理的架构,否则无法开发和维护.MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用. 一.MVC M ...

  9. 设计模式——MVC MVP MVVM

    了解到Vue是MVVM前端框架, 中午就研究了一下MVVM,但要从MVC开始说起: M(Model):模型,提供数据: V(View):视图,负责显示: C(Controller):控制器,负责逻辑处 ...

随机推荐

  1. JavaScript设置简单的自动时间

    下面就是一段简单的JavaScript设置简单的自动时间,时间显示在一个输入框input里面. <html> <head> </head> <body> ...

  2. 方法控件[置顶] Asp.net总结(一)

    本文朋友在青岛逛街的时候突然想到的...这两天就有想写几篇关于方法控件的博客,所以回家到之后就奋笔疾书的写出来发表了 纵观 Asp.net的学习只会之路,可以发现 Asp.net可以分为以下几大块 控 ...

  3. classnull100 - The 3n + 1 problem

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正  The 3n + 1 problem  Background Problems in Computer Science are o ...

  4. Java核心技术 卷Ⅰ 基础知识(2)

    第四章 对象与类 基于类的访问权限 静态域 类的设计技巧

  5. hdu1037

    #include <iostream> #include <cstdio> using namespace std; int main() { int a,b,c; while ...

  6. R语言 关联规则

    在用R语言做关联规则分析之前,我们先了解下关联规则的相关定义和解释. 关联规则的用途是从数据背后发现事物之间可能存在的关联或者联系,是无监督的机器学习方法,用于知识发现,而非预测. 关联规则挖掘过程主 ...

  7. SpringMVC @ResponseStatus 的用法

    @ResponseStatus 用于修饰一个类或者一个方法,修饰一个类的时候,一般修饰的是一个异常类,如下, 声明一个异常类在类上面加上ResponseStatus注解,就表明,在系统运行期间,抛出A ...

  8. Mysql之CentOS初探

    1. 卸载mysql 查看CentOS是否已经安装mysql数据库 rpm -qa | grep mysqlrpm -qa | grep MySQL 如果有,则卸载 // --nodeps表示强制rp ...

  9. ORALCE 编译过程卡死解决方法。

    --摘自网易博客 术士 在对存储过程进行test的时候,没有完全停止,就又在另外一个窗口,对它进行修改而且进行编译,出现了卡死现象. 用PLSQL Developer 在session里,找到这条se ...

  10. 取汉子拼音首字母的C#和VB.Net方法

    转载http://blog.fwhyy.com/2012/03/take-the-first-initials-method-of-csharp-and-vbnet/