MVC和MMVC架构

初因

原文地址:https://www.aclihui.com
深入了解MVV 架构和MMVC架构,为以后软件设计打下基础。

MVC架构

M:Model模型 V: View视图 C:Controller控制器

模型(来自维基百科的解释,注1)

M:用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“ Model ”有对数据直接访问的权力,例如对数据库的访问。“Model”不依赖“View”和“Controller”,也就是说, Model 不关心它会被如何显示或是如何被操作。但是 Model 中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此 Model 的 View 必须事先在此 Model 上注册,从而,View 可以了解在数据 Model 上发生的改变。(比如:观察者模式(软件设计模式))

视图

V:能够实现数据有目的的显示(理论上,这不是必需的)。在 View 中一般没有程序上的逻辑。为了实现 View 上的刷新功能,View 需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册。

控制器

起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。
展示图:

此时我们发现,相互关系如图所示。
M负责控制View的显示,V需要时刻监视M的情况,而C则为相事件对M进行处理。

总结

MVC架构是一种业务逻辑和数据分离的方法,这个方法假设前提是如果业务逻辑被聚集到一个部件里面,而且页面和用户围绕数据的交互能被改进和个性化而不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入,处理和输出功能在一个逻辑的图形化界面结构中。(注2)

MMVC

MMVC是在MVC中间加入一层ViewModel起到适配(一些Model建模为了与其他系统实现完全隔离,存储的只是id,此处需要根据id去组装起所需的数据),隔离扩展。

M

完全隔离的Model只会被引用(监视),不会引用外部的东西,通常只会对需要的数据进行建模(比如id),不需要的数据则不需要进行建模。

View

承担各种界面事件交互逻辑,其核心关键词是:数据展示、操作。其中除了特定的操作、交互功能外,最为重要的三个功能点,即是初始化、刷新、返回值、事件。

ViewModle

网站上没有多少介绍

C

和MVC架构基本相同。

引用

1.
2.https://www.cnblogs.com/suriyel/articles/3332408.html

MVC实现

MFC

微软所推出的MFC Document/View架构是早期对于MVC模式的实现,MFC将程序分成CView以及CDocument两大类别,其中的Document对应MVC中的 Model ,View 相当于MVC中的 View+Controller,再加上CWinApp类别,合成三大项。但是基本上MFC是一个失败的MVC模式作品。

由于MFC之下的Document/View 定义过于模糊,未将Controller(MessageMap)部分取出,因此 Controller 可以置入 View 或Document,但不管置入哪一方面,都会与View或Document绑死,没有弹性。

Java

Java 平台企业版 (J2EE)
和其他的各种框架不一样,J2EE为模型对象(Model Objects)定义了一个规范。

视图(View)
在J2EE应用程序中,视图(View)可能由Java Server Page(JSP)担任。生成 View 的代码则可能是一个servlet的一部分,特别是在客户端服务端交互的时候。
控制器(Controller)
J2EE应用中,Controller 可能是一个servlet。
除了可直接以J2EE来撰写外,亦可用其他框架来撰写,常见的有Struts2、Spring Framework……等等。
模型(Model)
Model 则是由一个实体Bean来实现。
Java Swing
Swing是一个标准的MVC结构. ComponentUI代表 View, 负责描画组件. 组件尤其 Model 层, 比如JTextField的Document, JTable的TableModel, JTree的TreeModel等等. 而Control可能不是很明显, 我们或许可以简单的将其Event机制看作一个Swing团队开发给开发者的 Controller。

作为Java开发者, 如果想理解MVC的结构, 学习Swing的确是个不错的选择.

.NET

ASP.NET
在ASP.NET中,针对视图(View)和控制器(Controller)的模式没有被很好地定义。而模型(Model)则留给开发者去设计。

视图(View)
ASPX和ASCX文件被用来处理 View 的职责。在这个设计中 View 实际上是从 Controller 继承而来。这个和Smalltalk的实施有所不同,在Smalltalk中不同的类都有指针互相指向对方.
控制器(Controllers)
Controller 的职责被分割成两部分。事件(Event)的产生和传输是框架的一部分,更明确的说是Page和Control两个类。而事件的处理则在分离的代码中实现。
模型(Model)
ASP.NET 不严格需要一个 Model。开发者可以自行选择创建一个 Model 类,但是很多人选择放弃这一步,直接把事件处理放在 Controller 里处理任何计算、数据保存等等。但用 Model 来包含商业逻辑和数据访问是可实现的。
ASP.NET MVC
ASP.NET MVC,在2013年10月17日稳定版本已到5.0版。[3]
此外,在ASP.NET MVC中,一般情况下Model通常搭配LINQ to SQL类别(使用O/R Designer工具所制作而成的DBML档)或ADO.NET实体数据模型(Entity Data Model,使用ADO.NET Entity Framework制作出的EDMX档)来实现。

Windows Forms

在WinForms中,这个针对视图(View)和控制器(Controller)的模式已经很好的定义。而模型(Model)则留给开发者去设计。

视图(View)
由Form或者Control类继承来的一个类处理 View 的职责。在WinForm这个例子中 View 和 Controller 被编译在同一个类中,这个和ASP.NET不同。
控制器(Controller)
Controller 的职责被分割成三部分。事件(Event)的产生和传输是操作系统的一部分。在.Net框架中Form和Control类将不同的事件转发给相应的事件处理器。而事件的处理则在分离的代码中实现。
模型(Model)
就像ASP.NET一样,WinForm不严格需要一个 Model。开发者可以自行选择创建一个 Model 类,但是很多人选择放弃这一步,直接把事件处理放在 Controller 里处理任何计算、数据保存等等。也就是说用Model来包含商业逻辑和数据访问。

Perl

Catalyst和Jifty是透过Perl语言所开发出来的Web Framework,都采用Model-View-Controller 架构。Catalyst 本身只是做了 Controller,View 和 Model 让开发者自由选用 CPAN 上的模块开发,例如 Template 和 Template Declare 都可用来产生视图。Jifty 将 MVC 完全实做完成,View 的部分在早期版本使用 Mason 实做,较新版本使用 Template Declare。

Ruby on Rails

Ruby on Rails是透过Ruby语言所开发出来的 Web Framework,也是采用 Model-View-Controller 架构。Model 部分使用 Active Record 概念实做,加上 Migration 机制,使得其 Model 结构非常容易控制。

Python

Python 有许多的 MVC 架构。最常用的有 Django 和 TurboGears。

JavaScript

Backbone.js
Angular.js
Ember.js
JavaScriptMVC
Model-View-Controller (MVC) with JavaScript

PHP

CakePHP
CodeIgniter
prado
symfony
Yii Framework
Zend Framework
Phalcon
Laravel
ThinkPHP

ActionScript 3

PureMVC Standard for ActionScript 3