MVC是设计模式还是架构模式?

129

根据SunMsdn,这是一种设计模式。

根据Wikipedia,这是一种架构模式。

与设计模式相比,架构模式规模更大。 (维基百科 - Architectural pattern

还是说它既是架构模式又是设计模式?

哪一个是正确的?


1
必须要有一个绝对正确的答案...... - Mike G
根据Product Madness的Dave所说,MVC是一种设计模式,而RobotLegs也是。 :P - andygoestohollywood
10个回答

74

MVC更多是一种架构模式,而不是完整应用的解决方案。MVC主要涉及应用程序的UI/交互层。您仍然需要业务逻辑层、可能还有一些服务层和数据访问层。也就是说,如果您采用n层方法。


18
是的,我会说MVC是你的展示层的一种架构模式。 - murki
11
我强烈反对"MVC主要与应用程序的UI/交互层有关"。 "M"/模型在MVC中实际上代表业务层,您可能希望将其拆分为多个层。 - mewm
是的,这个答案是错误的。MVC绝对不是关于UI/交互的。你可以在前端和后端完美地使用MVC,在开始时,视图通常只是一个html/js或.jsp或.phtml文件,服务器定义控制器和模型。例如JSP(视图),JavaBeans(模型),Servlet(控制器)。所有著名的php框架(symphony、zend、cake等)都采用相同的概念。但现代前端框架看起来像后端应用程序,现代JavaScript框架使用MVC(HTML作为视图,控制器作为脚本,模型作为JS对象实体)。 - amdev

51

为什么其中一个必须是真的?

根据不同的视角,两者都可以是真的。

如果MVC是应用程序架构的基础,则它可以成为一种架构模式。

它也可以被视为一个设计模式,一个适用于任何应用程序的抽象概念。


32

设计模式告诉我们如何有效地编写代码(考虑 代码指标)。

一些好处:

  1. 易于维护
  2. 高度可重用性
  3. 因为抽象而易读

架构模式告诉我们如何有效地利用资源。

  1. 并行任务执行,例如程序员和图形设计师可以并行工作。
  2. 可以利用多种技术来构建软件。

在MVC中, a). 可以使用JavaScript模板创建视图,也可以使用HTML b). 控制器可以使用.NET框架编写 c). 模型可以使用Java编写 - 可以使用返回仅JSON数据的Java服务。

而在设计模式中,不能实现多种技术编写代码的模式,例如Java中的AdminUser类、C#中的Customer类、Php中的Partners类以及Ruby中的工厂模式 :); 嗯..太容易了吧? :)


11

我知道这个问题已经在一段时间前得到了回答,但是还没有人提到使MVC模式著名的书籍:《面向模式的软件架构》(POSA),作者是Buschmann等人,于1996年出版。虽然POSA没有像Gamma等人的《设计模式》一书那样广为人知,但它是模式社区使用的基础性书籍之一。

另外,POSA非常清楚地将MVC识别为一种架构模式。我的直觉是,微软和Sun只是粗心地把每个模式都称为“设计模式”。


6
Model/View/Controller (MVC)三位一体类中的设计模式包括但不限于以下几种:
- Observer观察者模式,解除对象之间的耦合,使得一个对象(即Model)的变化可以影响到其他任意多个对象(即Views),而无需改变该对象(即Model)对其他对象(即Views)的了解程度。
- Composite组合模式,将一组对象(即Composite View)和它的各个子对象(即View Components)看作同等待遇的对象进行处理。
- Strategy策略模式,让一个View使用Controller子类的实例来实现特定的响应策略。想要实现不同的策略,只需要用另一种类型的Controller替换该实例即可。
- Factory Method工厂方法模式,指定一个View的默认Controller类。
- Decorator装饰者模式,为某个View添加滚动条。
参考文献:
- 《设计模式:可复用面向对象软件的基础》(Eric Gamma, Richard Helm, Ralph Johnson, and John Vlissides,Addison-Wesley出版社,1994年),第1.2节Smalltalk MVC中的设计模式,第293至304页Observer模式,第163至174页Composite模式,第315至324页Strategy模式,第107至116页Factory Method模式,第175至185页Decorator模式。

2
谢谢,所有其他答案都是错误的。这绝对不是“取决于观点”,拥有十几个或数百个投票也不会使错误变为真实。MVC本身不是一种设计模式,它是一种使用多种设计模式将代码架构化为3层的方式。所有在幕后实现MVC的框架都使用Observable、Strategy和Composite模式的概念。理解MVC的最佳方法是创建自己的实现,然后您将了解其背后的设计模式。 - amdev

3

我认为两者都是正确的。如果你在像Ruby on Rails这样的框架中查看MVC的特定实例化,那么该实例化更多地是一种设计模式。如果你将MVC视为一个通用概念,则它更多地是一种架构模式。


3

如果你把十个软件架构师放在一起讨论什么是模型-视图-控制器模式,你最终会得到十二种不同的意见。...一些纯粹主义者肯定会对我所说的“MVC”有所疑虑。欢迎在本网页底部的留言板上发表激烈的评论。我很乐意听取不同的MVC定义,但请记住我并不关心它们。

Josh Smith


2

根据Martin Fowler的说法,它们是GUI架构: Martin Fowler-GUI architectures

这取决于应用程序的大小,因为它只影响与GUI相关的类,在小型应用程序(主要是GUI)中,它可以被视为一种架构模式,而在大型应用程序中,它只是一个应用于GUI代码的设计模式(可能占应用程序代码的10%)。


2

7
为什么有两个答案?你可以将这个答案作为附加说明添加到你的第一个答案中。 - frogatto

0

此链接现已离线。 - ssc-hrep3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接