Gang of Four Design Patterns如何融入MVC范例?

时间:2012-02-02 20:39:42

标签: model-view-controller oop design-patterns

我已经仔细研究了设计模式一段时间了,我刚刚开始看到我如何才能真正开始在我的开发工作中更加谨慎地融入其中一些。但是,我仍然对本书开头的MVC处理以及它与本书其余部分的关系感到困惑。

我使用过的大多数框架 - Spring,Yii,ASP.NET,甚至是Objective-C Cocoa(UIKit) - 都适合MVC范例。我得到了MVC,因为对我而言,它是一种分类对象以及它们应该如何相互消息或交互的有用方法。另外,即使你没有着手以MVC的方式思考,这些框架也会迫使你。

我也觉得我理解设计模式的前提:他们真的不喜欢子类化,他们喜欢抽象接口,他们努力松散耦合。我不能说我完全理解所有的模式或它们是如何有用的,但我对它有了感觉。

我的问题是:MVC和设计模式之间的相互作用是什么?他们在MVC应用程序示例的第一章中得到了什么?某些设计模式是否与MVC范例无关?我想知道,例如,Command模式应该如何适应MVC。它似乎非常有用,但我们是否创建了CommandModelCommandController以发送给其他控制器?我们只是按照书中的规定创建一个Command对象吗?基本上,我想知道MVC和设计模式的想法是完全不相交的,我只是不明白,或者是否有一些模式不适合模具。

4 个答案:

答案 0 :(得分:9)

我个人认为MVC是观察者模式的简化版本,它是中介模式的简化版本。

MVC :一个模型,一个视图,Controler管理它们之间的通信。

观察者模式:一个模型,多个视图(观察者/订阅者),以及发布者管理通信

中介模式:几种不同的模型,多种视图和中介管理它们之间的通信。

答案 1 :(得分:8)

GoF书中的MVC是针对桌面的,它使用观察者模式来更新视图。 GoF书中的命令示例适用于编辑器。

还有其他风格的MVC,其他设计模式的使用可能并不明显:
What is the difference between MVC and MVVM?
Presentation abstraction control

GoF书中说:

  

...

     

从表面看,这个例子反映了一种将视图与模型分离的设计。但是该设计适用于更普遍的问题:解耦对象,以便对一个对象的更改可以影响任意数量的其他对象,而不需要更改的对象知道其他对象的细节。 Observer(第293页)设计模式描述了这种更通用的设计。

     

MVC的另一个特性是可以嵌套视图。例如,按钮的控制面板可以实现为包含嵌套按钮视图的复杂视图。对象检查器的用户界面可以包含可以在调试器中重用的嵌套视图。 MVC支持使用CompositeView类(View的子类)的嵌套视图。 CompositeView对象就像View对象一样;可以在任何可以使用视图的地方使用复合视图,但它也包含和管理嵌套视图。

     

同样,我们可以将此视为一种设计,让我们可以像处理其中一个组件一样处理复合视图。但该设计适用于更普遍的问题,每当我们想要对对象进行分组并将组视为单个对象时,就会出现这种问题。这种更通用的设计由Composite(163)设计模式描述。它允许您创建一个类层次结构,其中一些子类定义基本对象(例如,Button),其他类定义复合对象(CompositeView),将基元组合成更复杂的对象。

     

MVC还允许您更改视图响应用户输入的方式,而无需更改其可视化表示。例如,您可能想要更改它响应键盘的方式,或者让它使用弹出菜单而不是命令键。 MVC将响应机制封装在Controller对象中。有一个控制器的类层次结构,可以很容易地创建一个新控制器作为现有控制器的变体。

     

视图使用Controller子类的实例来实现特定的响应策略;要实现不同的策略,只需用不同类型的控制器替换实例。甚至可以在运行时更改视图的控制器,以使视图更改其响应用户输入的方式。例如,可以禁用视图,以便仅通过为其提供忽略输入事件的控制器来接受输入。

     

视图 - 控制器关系是策略(315)设计模式的示例。策略是表示算法的对象。当您想要静态或动态地替换算法时,当您有很多算法变体时,或者当算法具有您想要封装的复杂数据结构时,它非常有用。

     

MVC使用其他设计模式,例如Factory Method(107)来指定视图的默认控制器类,而Decorator(175)则将滚动添加到视图中。但MVC中的主要关系由Observer,Composite和Strategy设计模式给出。

     

...

答案 2 :(得分:4)

MVC是一种模式。但它只涵盖了Web应用程序的一个小方面。与MVC一起使用的另一种常见模式是存储库。这些是更多的架构模式......它们的范围对整个项目有更大的影响。

GOF模式将以无所不知的方式介绍自己。他们可以根据设计选择帮助构建MVC基础架构。例如,策略被大量使用,因此您可以插入不同的方式来执行“身份验证”等操作。

您不必按原样使用模式,它们甚至不必是完全相同的代码结构。它更多的是您在设计中使用的模式的设计原则/目标。

答案 3 :(得分:2)

MVC是architectural pattern。它完全适合Command Pattern等其他设计模式。但是你不应该仅仅因为它们存在而应用模式,而是将它们写在权威书中。当您遇到编程/设计问题时,您可以应用模式,并且有一种方法可以解决其他人发现并被记录下来的问题。解决问题的方法是一种模式。例如,您有一个将数据保存到数据库的应用程序。要保存的数据非常复杂:必须插入一些记录,更新一些记录,删除一些记录。步骤序列很重要,因为要插入到一个表中的记录取决于要插入另一个表的记录。因此,必须使用database transaction。实现事务的一种可能方法是使用命令模式。在Larman的“Applying UML and Patterns”一书(“使用模式设计持久性框架”一章,“使用命令模式设计事务”一节 - 向下滚动到第556页)中可以很好地解释这样做的方法。 PersistentObject是一个抽象的Model类。所有其他Model类都扩展它。在该示例中,MVC在UI,应用程序和域层中实现,但Command在持久层中实现。这些模式有助于解决不同的问题,在这个例子中它们是相互支持的。