使用 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. 更新android SDK的问题

        由于我大天朝将google屏蔽的原因,在更新android SDK的时候,可能速度慢还是个小问题,重要的是你更新的时候出各种错误,比如错误  Failed to fetch URL https ...

  2. 绩效考核指标KPI 听课笔记

    以前一直听人在说KPI,今天终于明白KPI是什么意思了!

  3. iOS之崩溃处理:This application is modifying the autolayout engine from a background thread

    一.错误提示 今天在开发的时候遇到一个崩溃问题,"This application is modifying the autolayout engine from a background ...

  4. Smallest multiple

    problem 5:Smallest multiple 题意:求最小的正数,使得其可以被1-20整除 代码如下: #ifndef PRO5_H_INCLUDED #define PRO5_H_INCL ...

  5. Apache Tomcat部署java web项目

    本教程安装环境为windows服务器 在服务器中下载安装JDK JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8 ...

  6. c#:readonly与const的区别

    readonly与const的区别: 1.初始化:const  字段只能在该字段的声明中初始化. readonly  字段可以在声明或构造函数中初始化. 2.值: const 字段是编译时常量(con ...

  7. 使用signalR创建聊天室。

    浏览器支持Html5的情况下,SignalR使用WebSockets,当不支持时SignalR将使用其它技术来实现通讯. 界面如下:左侧包含三种聊天对象,不同的聊天对象会创建不同的对话框. 设计思路参 ...

  8. mysql与oracle在groupby语句上的细节差异

    前言 之所以去纠那么细节的问题,是因为之前有过一个这样的场景: 有个同学,给了一条数据库的语句给我,问,为啥这样子的语句在oracle语句下执行不了. select * from xx where x ...

  9. 获取URL中的参数值

    //获取url中ID的值function getParamByName(name, url) { var match = RegExp('[?&]' + name + '=([^&]* ...

  10. 冰刃IceSword中文版 V1.22 绿色汉化修正版

    软件名称: 冰刃IceSword中文版 V1.22 绿色汉化修正版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 2.1MB 图片预览: 软件简介: Ic ...