MVC(Model-View-Controller)模式的基本思想是数据,显示和处理相分离。模型(Model)负责数据管理,视图(View)负责数据显示,控制器(Controller)负责业务逻辑和响应策略。

从MVC的形成过程来看,最初只有模型和视图两个元素。模型封装了数据并提供操作接口,视图用来表现数据和接收用户请求。模型是独立的,而视图依赖于模型:从模型获取数据进行显示;向模型发送用户请求,并根据返回结果刷新自己。

需要用多个视图表现同一模型时,情况发生了变化:一个视图修改数据以后,不但本身要刷新,其他所有视图也要刷新。如果由该视图通知其他视图,它就需要知道其他所有视图,由于每个视图都可能发出修改,每个视图都要知道其他所有视图,这种关联过于复杂,不但难以维护,而且不便于增加新的视图。如果让模型通知所有视图更新,可能会影响模型的独立性。用观察者(Observer)模式可以解决上述矛盾,从而实现:由模型通知视图,而模型不依赖于具体的视图,具体视图之间相互独立。

视图是用户请求的接收者,但不宜作为请求的处理者。因为界面是易变的,如果业务代码和界面代码放在一起,频繁的界面修改可能会破坏比较稳定的业务代码。将业务逻辑分离出来,由一个控制器负责,就是为了避免这种干扰。

模型,视图和控制器的基本协作关系如下图

模型在状态变化的时候,直接通知所有视图,视图向模型查询状态数据,然后刷新自身。当用户发出操作时,视图把消息发给控制器,控制器按照业务逻辑进行处理,需要查询或更新数据时,控制器会调用模型。下面是一个更详细的示意图


同样的数据,可以有不同的显示和进行各种处理。显示仅仅是表现数据,而处理是根据用户请求改变数据的过程,不但包含业务逻辑,也要提供响应策略。响应策略由控制器负责,视图可以使用不同的控制器提供不同的响应方式,这是策略(Strategy)模式的应用。

此外,MVC还允许视图嵌套,通过使用组合(Composite)模式,一致地处理组合视图和普通视图。

用多个视图表现一个模型,在视图不变的情况下改变响应策略,允许视图嵌套,这是MVC的三个主要特性。在内部结构上,MVC的主要关系是由观察者模式,策略模式和组合模式给出的。由观察者模式确定的模型视图关系是其中最为重要的。

MVC模式有许多变体。前述结构中,由模型通知视图刷新,称为主动MVC;如果由控制器更新模型以后通知视图,称为被动MVC结构。在许多应用中,没有明显的控制器角色,也没有视图嵌套。可见根据实际需要,构成MVC的三个模式上都可能出现变化。Web浏览器就是被动MVC结构的一个实例。
“浏览器是一个交互程序,从概念上讲,它是由一组客户、一组解释器与一个管理它们的控制器所组成。控制器形成了浏览器的中心部件,它解释鼠标点击与键盘输入,并且调用其他组件来执行用户指定的操作。例如,当用户键入一个URL或者点击一个超文本引用时,控制器调用一个客户从所需文档所在的远程服务器上取回该文档,并且调用解释器向用户显示该文档。每个浏览器必须包含一个HTML解释器来显示文档,其他解释器是可选的。HTML解释器的输入由符合HTML语法的文档所组成,输出由位于用户显示器上的格式版本文档所组成。解释器通过将HTML规则转换成适合用户显示硬件的命令来处理版面细节。HTML解释器一个最重要的功能是包含可选项。解释器必须存储关于显示器上位置之间关系的信息和HTML文档中被瞄定的项。当用户用鼠标选定了一个项,浏览器通过当前的光标位置和存储的位置信息来决定哪个项被用户选定。”(参考资料5)

MFC的文档/视图结构(Document/View architecture)是MVC模式的一种变体,下面讨论它是怎样实现的。

文档/视图结构没有体现业务逻辑和视图的分离,但是将响应策略和视图区分开来。它主要包含四种对象:

  1. 文档
  2. 视图
  3. 视图框架窗口
  4. 文档模板

这里的视图框架窗口定义了视图对用户输入的响应方式,而文档模板用来管理前三种对象的组合。文档,视图,视图框架窗口三者是对应的,从而构成一个三元组。一个应用程序可能需要多个这样的三元组,以实现文档的多视图,所以引入文档模板来表示该三元组。因为程序中可能使用多个文档模板,MFC用一个文档管理者对象来管理它们。

在MFC中,应用程序和主框架窗口是用来封装底层机制的对象,文档,视图,视图框架窗口和文档模板是用来构架文档/视图结构的对象。应用程序通过文档管理者来使用文档/视图结构。

如果要给文档增加一种视图,只需要增加一个文档模板;如果要改变一种视图的响应策略,只要改变对应文档模板中的视图框架窗口。

<未完待续>

参考资料:

1.《设计模式-可复用面向对象软件的基础》/Erich Gamma等著,李英军等译 机械工业出版社
2.《Java与模式》/阎宏 电子工业出版社
3.  模型-视图-控制器 ( MSDN > 技术资源库 > 体系结构 > 使用 Microsoft .NET 的企业解决方案模式 >第3章 Web 表示模式)
4. 《Java设计:对象,UML和过程》/Kirk Knoernschild 著,罗英伟等译 人民邮电出版社
5. 《计算机网络与因特网》/D.E.Comer 著 徐良贤等译 机械工业出版社
6.《深入解析MFC》/中国电力出版社
7.《VC技术内幕》第5版 / 希望电子出版社

MVC模式和文档/视图结构相关推荐

  1. 深入分析MFC文档视图结构(项目实践)

    文档视图结构(Document/View Architecture)是MFC的精髓,也是Observer模式的具体实现框架之一,Document/View Architecture通过将数据和其表示分 ...

  2. 谈IE的浏览器模式和文档模式

    以前在 "IE8兼容视图(IE7 mode)与独立IE7的区别"一文中曾经涉及过浏览器模式和文档模式,但二者的区别却不甚了了,现在有了新的认识,再补充一下. 1.浏览器模式与文档模 ...

  3. C++--深入分析MFC文档视图结构(项目实践)

    1 必备基础知识概述 1.1 MFC 文档视图结构程序结构总揽 当我们使用 MFC AppWizard 生成一个 MFC 程序,选用所有默认的设置(当然也是 Multiple Documents ,本 ...

  4. MFC让文档/视图结构程序支持滚动条

    MFC让文档/视图结构程序支持滚动条 2009-06-30 09:26要通过滚动条显示文档,还必须知道文档滚动到了什么位置:一旦用户拖动滚动条时要告诉视图改变在文档中 的位置.所有这些,由MFC的CS ...

  5. 视图切换—多模板文档视图结构的应用

    转自:http://www.winu.cn/htmls/208/065/ 一.概述 ①在一个MDI程序中,需要使用到不同类型的子窗口,而每种类型窗口有可能有很多个,对应不同的数据. 这时,可以使用多模 ...

  6. JS魔法堂:浏览器模式和文档模式怎么玩?

    一.前言 从IE8开始引入了文档兼容模式的概念,作为开发人员的我们可以在开发人员工具中通过"浏览器模式"和"文档模式"(IE11开始改为"浏览器模式& ...

  7. 再谈IE的浏览器模式和文档模式[转]

    http://www.cnblogs.com/liuzhendong/archive/2012/04/27/2474363.html 以前在 "IE8兼容视图(IE7 mode)与独立IE7 ...

  8. J2EE系列:再谈IE的浏览器模式和文档模式

    以前在 "IE8兼容视图(IE7 mode)与独立IE7的区别"一文中曾经涉及过浏览器模式和文档模式,但二者的区别却不甚了了,现在有了新的认识,再补充一下. 1.浏览器模式与文档模 ...

  9. html中ie9文档模式,IE9:强制IE9浏览器模式和文档模式(IE9: Force IE9 browser mode and document mode)...

    IE9:强制IE9浏览器模式和文档模式(IE9: Force IE9 browser mode and document mode) 在IE9中,我的网页显示为Browser Mode: IE9 Co ...

最新文章

  1. 【bootstrap】如何解决页面缩小后上方导航栏格式变化的问题
  2. Transport (VMDB) error -44: Message
  3. ECCV 2018 《Triplet Loss in Siamese Network for Object Tracking》论文笔记
  4. Python精通-运算符与基本数据类型(二)
  5. 29muduo_net库源码分析(五)
  6. 硬件加密芯片介绍 及 加密芯片选择(加密IC) 加密芯片原理
  7. obj模型 vue_Vue各种各样的模型库 Cornucopia 3D for Vue
  8. AUTOCAD——圆弧命令
  9. SiamRPN代码分析:training
  10. tesseract安装及配置
  11. 解析 数据库 苹果自带地图
  12. 主动外观模型(AAM)
  13. 题目:某班的成绩出来了,现在老师要把班级的成绩打印出来。 效果图: XXXX年XX月X日 星期X 班级总分为:xx 班级平均分:xx
  14. Golang的reflect
  15. 使用HTML写一个个人简历
  16. Binarized Convolutional Landmark Localizers for Human Pose Estimation and Face Alignment with Limite
  17. 魔都记----在美团工作
  18. PinPoint使用手册
  19. 互联网金融风控中的数据科学
  20. 万兆以太网是什么?如何测试维护?TFN T3000A万兆以太网测试仪

热门文章

  1. php 二维数组字段合并,PHP将二维数组某一个字段相同的数组合并起来的方法,二维数组数组_PHP教程...
  2. html5显示字幕信息,HTML5 Placeholder实现input背景文字提示效果
  3. 用c语言做教学课程安排,C语言入门课程安排
  4. Zookeeper集群脑裂问题
  5. SpringBoot技术栈搭建个人博客【项目准备】
  6. 代码回滚:Reset、Checkout、Revert 的选择
  7. 十个免费的WEB压力测试工具
  8. Eclipse中集成Tomcat
  9. 排序算法:希尔、归并、快速、堆排序
  10. 压缩感知(I) A Compressed Sense of Compressive Sensing (I)