浅析MVC设计思想
一、MVC设计思想
MVC英文即Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样一个应用被分成三个层——模型层、视图层、控制层。
视图(View)代表用户交互界面,对于Web应用来说,可以概括为HTML界面,但有可能为 XHTML、XML和Applet。随着应用的复杂性和规模性,界面的处理也变得具有挑战性。一个应用可能有很多不同的视图,MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的请求,而不包括在视图上的业务流程的处理。业务流程的处理交予模型(Model)处理。比如一个订单的视图只接受来自模型的数据并显示给用户,以及将用户界面的输入数据和请求传递给控制和模型。[break]
模型(Model):就是业务流程/状态的处理以及业务规则的制定。业务流程的处理过程对其它层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的核心。目前流行的EJB模型就是一个典型的应用例子,它从应用技术实现的角度对模型做了进一步的划分,以便充分利用现有的组件,但它不能作为应用设计模型的框架。它仅仅告诉你按这种模型设计就可以利用某些技术组件,从而减少了技术上的困难。对一个开发者来说,就可以专注于业务模型的设计。MVC设计模式告诉我们,把应用的模型按一定的规则抽取出来,抽取的层次很重要,这也是判断开发人员是否优秀的设计依据。抽象与具体不能隔得太远,也不能太近。MVC并没有提供模型的设计方法,而只告诉你应该组织管理这些模型,以便于模型的重构和提高重用性。我们可以用对象编程来做比喻,MVC定义了一个顶级类,告诉它的子类你只能做这些,但没法限制你能做这些。这点对编程的开发人员非常重要。
业务模型还有一个很重要的模型那就是数据模型。数据模型主要指实体对象的数据 保存(持续化)。比如将一张订单保存到数据库,从数据库获取订单。我们可以将这个模型单独列出,所有有关数据库的操作只限制在该模型中。
控制(Controller)可以理解为从用户接收请求, 将模型与视图匹配在一起,共同完成用户的请求。划分控制层的作用也很明显,它清楚地告诉你,它就是一个分发器,选择什么样的模型,选择什么样的视图,可以完成什么样的用户请求。控制层并不做任何的数据处理。例如,用户点击一个连接,控制层接受请求后, 并不处理业务信息,它只把用户的信息传递给模型,告诉模型做什么,选择符合要求的视图返回给用户。因此,一个模型可能对应多个视图,一个视图可能对应多个模型。
模型、视图与控制器的分离,使得一个模型可以具有多个显示视图。如果用户通过某个视图的控制器改变了模型的数据,所有其它依赖于这些数据的视图都应反映到这些变化。因此,无论何时发生了何种数据变化,控制器都会将变化通知所有的视图,导致显示的更新。这实际上是一种模型的变化-传播机制。
博主

人生就流星,虽然转瞬即逝,但也有永恒。
日历
恰饭
分类
热门文章
- 使用Erlang的OTP框架创建应用
- 新浪微博错误代码解析
- 腾讯QQ、阿里旺旺、淘宝、MSN在线状态代码生成
- php 使用curl模拟登录discuz以及模拟发帖
- erlang程序设计笔记
- 《HTML 5与CSS 3权威指南》权威的HTML5与CSS3实战教程
- dedecms修改数据库密码配置文件
- 服务器优化小记--Etag和Expires
- 在PHP5中使用PHPMailer发送邮件
- PHP中冒号、endif、endwhile、endfor介绍
- PHP框架——ThinkPHP
- QQ登陆成功返回openId后与网站绑定
- Mediawiki的配置和修改方法
- 用yaf-codes-generator 生成代码
- 解决缓存引发的CSS/JS/IMG问题
最新日志
- React组件的State
- golang 复制对象的正确做法
- 基于DDD的golang实践案例
- golang搜索引擎
- go语言string、int、int64互相转换
- golang-使用 go test 输出单元测试覆盖率
- 统计 Golang 项目的测试覆盖率
- golang goquery selector(选择器) 使用
- golang中设置Host Header的小Tips
- Linux抓包工具Tcpdump使用示例教程
- 腾讯云挂载初始化云硬盘
- 如何在 CentOS 上修改主机名
- 漫谈非加密哈希算法(MurMurHash,CRC32,FNV,SipHash,xxHash)
- Go 每日一库之 goquery
- python程序在命令行执行提示ModuleNotFoundError: No module named 'XXX' 解决方法
存档
- 2022年6月(2)
- 2022年5月(2)
- 2022年4月(1)
- 2022年3月(2)
- 2021年12月(1)
- 2021年11月(14)
- 2021年10月(2)
- 2021年9月(111)
- 2015年3月(1)
- 2014年5月(4)
- 2014年4月(18)
- 2014年1月(1)
- 2013年11月(2)
- 2013年7月(1)
- 2013年6月(1)
- 2013年3月(13)
- 2013年2月(3)
- 2013年1月(1)
- 2012年12月(8)
- 2012年11月(8)
- 2012年10月(1)
- 2012年9月(13)
- 2012年8月(4)
- 2012年6月(2)
- 2012年5月(10)
- 2012年4月(13)
- 2012年3月(9)
- 2012年2月(8)
- 2011年11月(1)
- 2011年8月(9)
- 2011年7月(8)
- 2011年6月(8)
- 2011年5月(7)
- 2011年4月(19)
- 2011年3月(15)
- 2011年2月(8)
- 2011年1月(9)
- 2010年12月(2)
- 2010年11月(2)
- 2010年10月(2)
- 2010年9月(8)
- 2010年8月(9)
- 2010年7月(1)
- 2010年6月(9)
- 2010年5月(5)
- 2010年1月(7)
- 2009年12月(21)
- 2009年11月(29)
- 2009年10月(100)
- 2009年8月(1)
- 2009年7月(15)
- 2009年6月(52)
标签
-
php
心情
Google
百度
反链
PR值
Meta
ActiveRecord
sql
离职信
fckeditor
Linux
dd
PHP框架
DDoS
正则
dedecms
netstat
top
free
bash
shell
mysql
设计
html
ssh
useradd
network
vim
apache
innodb
flash
文件
find
ls
代号
grep
swap
TCP
mysqldump
架构
故事
采集
TOM
面试题
优化
SVN
SEO
CMS
join
进制
nginx
安全
模式
thinkphp
总结
eAccelerator
Music
yii
MemCached
cookie
MVC
索引
joke
算法
Ubuntu
配置
扩展
du
tar
字符集
Firefox
数据库
Rsync
SecureCRT
discuz
ORM
explain
笑话
Etag
Expires
淘宝
摄影
电影
vi
信号
php书籍
header
模板
jQuery
规范
Python
学习
资料
手册
文言文
英语
方法
提示
人脉
电子商务
网络营销
谨记
兼容
前端
godaddy
ip
SERVER
DSN
MediaWiki
json
oauth
开放平台
javascript
404
虚拟礼物
水印
qq登陆
redis
图书
git
图表
C++
Objective-C
android
移动开发
IOS
sae
yii-sae
bootstrap
前端开发
短网址
经典图书
引用
开源
session共享
LogFormat
erlang
综合搜索
编程语言
豆瓣
网赚
客户端
Mac
Geolocation
团队
微博
博客
md5
yaf
guid
tag
开源项目
单点登录
面试
PHPExcel
SQL Server
group_concat
习惯
阿里云
PHP升级
模型
replace
emlog
命令
爬虫
单元测试
腾讯云
服务器
播放器
go
golang
gomod
gopath
框架
工具
composer
nodejs
http
homebrew
brew
error
水平居中
测试
markdown
java
rsa
screen
command
supervisor
Logrotate
ce
tmux
computer
video
Future
天网
无密码
效率
mod
Module
test
统计
shen
生活
写作
阅读
读书
c
excel
xlsx
code-review
错误处理
yaml
epoll
Consul
pulsar
port
context
redirect
urlencode
urldecode
validator
gomock
mockgen
goquery
hostname