在GoF书中提到的MVC是针对桌面应用程序的,它使用观察者模式来更新视图。而GoF书中的命令示例是针对编辑器的。
还有其他类型的MVC,其中使用其他设计模式可能不那么明显:
MVC和MVVM之间有什么区别?
Presentation abstraction control
GoF书中说:
表面上看,这个例子反映了一种将视图与模型分离的设计。但是这种设计适用于一个更普遍的问题:解耦对象,使得对其中一个对象所做的更改可以影响到任意数量的其他对象,而不需要更改的对象知道其他对象的详细信息。Observer (第293页) 设计模式描述了这种更普遍的设计。
MVC的另一个特点是视图可以嵌套。例如,按钮控制面板可以作为包含嵌套按钮视图的复杂视图来实现。对象检查器的用户界面可以由嵌套视图组成,这些视图可以在调试器中重复使用。MVC使用CompositeView类支持嵌套视图,它是View的一个子类。CompositeView对象的行为就像View对象一样;复合视图可以在可以使用视图的任何地方使用,但它还包含并管理嵌套视图。
同样,我们可以认为这是一种让我们像处理其组件之一一样处理复合视图的设计。但是这种设计适用于一个更普遍的问题,即每当我们想要将对象分组并像单个对象一样处理该组时,都会出现这种问题。Composite (163) 设计模式描述了这种更普遍的设计。它允许您创建一个类层次结构,其中某些子类定义原始对象(例如Button),而其他类定义复合对象(CompositeView),将原始对象组装成更复杂的对象。
MVC还允许您更改视图对用户输入的响应方式,而无需更改其视觉呈现方式。例如,您可能希望更改它对键盘的响应方式,或者让它使用弹出菜单而不是命令键。MVC在Controller对象中封装了响应机制。有控制器的类层次结构,使得创建一个新控制器作为现有控制器的变体变得容易。
视图使用Controller子类的实例来实现特定的响应策略;要实现不同的策略,只需用不同类型的控制器替换实例即可。甚至可以在运行时更改视图的控制器,以便让视图更改其对用户输入的响应方式。例如,可以通过给视图提供忽略输入事件的控制器来禁用视图,使其无法接受输入。
View-Controller关系是Strategy (315) 设计模式的一个例子。Strategy是表示算法的对象。当您想要静态或动态地替换算法、有大量算法变体或算法具有您想要封装的复杂数据结构时,它非常有用。
MVC使用其他设计模式,例如Factory Method (107)来指定视图的默认控制器类和Decorator (175)来向视图添加滚动条。但MVC中的主要关系由Observer、Composite和Strategy设计模式给出。