Cocoa环境的许多体系结构和机制都有效地利用了设计模式:使用抽象的设计解决实际特定情境中的反复出现的问题。本章描述了Cocoa中的设计模式的主要实现,特别关注MVC和对象建模。本章的主要目的是让你更好的了解Cocoa的设计模式,并鼓励你在自己的软件项目中利用这些模式。
什么是设计模式
设计模型是用于解决特定上下文中的常见问题的设计模板。它是一种抽象工具,在架构、工程和软件开发领域中都很有用。接下来将总结什么是设计模式,解释为什么他们对面向对象设计很重要,并且展示一个示例设计模式。
上下文问题的解决方案
作为一名开发者,你可能已经对面向对象编程中的设计模型这一概念非常熟悉。在 Erich Gamma, Richard Helm, Ralph Johnson, 和 John Vlissides著作的《设计模型:面向对象软件的可复用元素》一书中,设计模型首次被权威的描述和记录。这本书,最初出版于1994年,随之很快,就有其他的书籍和文章进一步探索和阐述了面向对象系统中的设计模型。
设计模型的简洁的定义,是“特定上下文问题的解决方案”。让我们一个字一个字的来分析。“特定上下文”是设计模型被重复应用的场景。“问题”是你在此上下文中想要达到的目标,以及上下文附带的任何限制。“解决方案”是你想要的:实现了目标并解决了约束的上下文的通用设计。
设计模式对已经被多次证明有效的具体的设计的结构的关键方面进行了抽象。模型有名字,并且指明了参与该模型的类和对象,以及它们的职责和协作。它还详细说明了结果(成本和收益),以及能使用该设计模式的情景。设计模式是一种特定设计的模板,或者指南,在某种意义上,具体设计是模式的实例化。设计模式并不是绝对的,在如何应用它们方面,有一定的灵活性,而编程语言和现有的架构也决定了模式是如何应用的。
若干设计的主题或者原则影响着设计模式。这些设计原则是构造面向对象系统的经验法则,譬如,“对系统结构中变化的方面进行封装”,“编程到接口而不是实现”。它们表达着重要的见解,举个例子,如果隔离系统中变化的部分,并进行封装,它们就可以独立于系统的其他部分而变化,尤其是如果你为它们定义了与实现细节无关的接口时。你可以在之后替换或者扩展变化的部分,而不影响到系统的其他部分。于是你可以消除或者减少各个部分之间的耦合度,因此这个系统变得更加灵活,更容易改变。
这些优点使得设计模式成为编写软件时一个重要的考虑因素。一旦你发现,在你的编程设计中适应和使用模式,能提高程序(和它所包含的对象和类)的可复用性、可扩展性,并且在将来需要时更容易更改。此外,基于设计模式的程序比不基于设计模式的程序更优雅和高效,因为他们只需要更少的代码行数就能解决同样的问题。
一个例子:命令模式
“四人帮”(在 软件工程界里, 四人帮指被称为 设计模式先驱的四人:Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides)的书的大部分内容都包含了设计模式这一目录。按范围(类或对象)或目的(创建、结构、行为模式)对目录中的模式进行分类。目录中的每个条目讨论了设计模式的目的、动机、适用性、结构、参与者、协作、结果和实现。这其中一个条目就是命令模式(也称对象行为模式)。
本书阐述命令模式的动机为,把请求封装为对象,使得可以使用不同的请求、队列或者日志请求参数化客户端,支持可撤销操作。这个模式将发送消息的对象和接收、评估消息的对象分离开来。消息的发起者(客户端)通过把一个或多个操作绑定到特定的接收者来封装请求。被封装的消息能够在对象之间传递,放进队列中,或存起来用于以后的调用,并且能够根据消息的参数和接收者的不同来动态的修改。图4-1显示了该模式的结构图。
Figure 4-1 Structure diagram for the Command pattern
作为一个熟悉Cocoa的开发者,命令模式的简短概述可能敲响了警钟。该模式完美的描述了Foundation框架中以封装消息为目的的一个类:NSInvocation。就像该模式的意图所述,其目的之一就是使得操作可撤销。NSInvocation对象在Cocoa中用于撤销管理和分布式对象。分布式对象是进程间通信的体系结构。命令模式还描述了Cocoa中的目标-操作机制(尽管不是很完美),其中用户界面控件对象封装了用户激活它们时所发送的消息的目标和操作。
在其框架类、语言和运行时中,Cocoa已经为你实现了许多已编目的设计模式(这些实现在下一节“Cocoa如何适应设计模式”中会描述)。你可以使用设计模式的这些现成的适应性满足许多的开发的需要。或者你能根据你的问题和它的特定上下文,请求一个全新的属于你自己的模式设计。重要的是在开发软件时要注意模式,并在适当的时候在设计中使用它们。
原文链接:
Cocoa Design Patterns