什么是设计模式

什么是设计模式

设计面向对象的软件很难,设计可复用的面向对象软件更难。你必须找到相关的对象,以适当的粒度将它们归类,定义类的接口和继承层次,并建立对象之间的关键关系。你的设计应该能够处理手中特定的问题,同时还能够通用,以便处理将来的问题或其他需求,你还希望避免重新设计,或者至少以最低的代价来完成设计。有经验的面向对象设计者都会说如果想第一次就得到正确的结果,那么完成一种可重用的、灵活的设计将会非常困难。事实上,在完成一种设计之前,他们通常会重试多次,修改多次。

然而,这些内行设计者依然能完成良好的设计,与之对比的是,一些新手却因太多的选择而感到困惑,他们还常常倾向于依赖曾用过的非面向对象的技术来思维,对于新手来说,需要花很长的时间来了解良好的面向对象的设计,内行的人设计者就很明显的知道这些新手的问题出在哪里,这是什么原因呢?

内行的设计者知道不要做的一件事是:解决任何问题都从头做起。他们都是重用过去曾用过的方案,当发现一个好的方案时,他们会反复的使用,这种经历是成为行家的必需部分。因此,你会在许多面向对象系统中看到雷和相互通信的对象的重复模式,这些模式能解决特定的设计问题并使面向对象的设计更灵活,优雅以及极度便利的可复用,它们辅助设计者根据先前的设计经验来重用成功的设计,熟悉这些模式的设计者能够在不用重新查找的情况下立即应用到相关的设计问题中。

用类比的方法可以证明这个观点。小说家和剧作家几乎很少从零开始来设计他们的情节,相反他们采取一些模式,如带有悲剧性缺陷的主人公或者充满浪漫色彩的小说。用同样的方式,面向对象的设计者也使用一些模式,如用对象来表示状态,通过添加或者移除功能的方式来装饰对象,等等。一旦你知道这些模式,就能自动的作出很多设计决策。

我们都知道拥有设计经历的价值,你是否曾有多次这样的错觉:都不知道问题出在哪里或者怎样解决问题就把难题给解决了!如果你还记得上一次问题的细节以及怎样解决它的,然后你就可以重新借助上次的经历来完成问题而不用又重新去寻找方法。遗憾的是,我们还没有做好把这种设计经历用记录的形式那个他人使用。

本书旨在记录面向对象的软件设计中前辈们的经验,也可称为设计模式。每种模式都有系统的命名,解释意义以及能评估相应系统的设计。我们目标是获取人们能有效使用的设计经验,为此目的,我们编写了一些最重要的设计模式,并以编目分类的形式展现出来。

设计模式可以容易的重用那些成功的设计和架构,模式中的用到的技术对于新系统的开发者也很容易获取到,设计模式帮助你选择可用的设计,避免影响到已有的系统结构,设计模式还可以通过提供类与对象交互的明确的规范来提高已有系统的文档化和可维护性。仅仅使用设计模式后,设计者就可以得到更快更正确的设计。

Christopher Alexander说每种模式都描述了在我们的周遭中常常出现的问题,并提出该问题的核心解决方案,同时还用一种可以重用多次的方式来呈现。虽然Alexander谈论的是建筑上的模式,但他说的以适用于面向对象的设计模式。我们是方案是用对象和接口来表达而非墙壁和门窗,但是两者共通的地方实际场景中解决问题的方法。

一般而言,每种模式有如下四种必要的元素:

1. 模式的名称。它负责描述设计问题,解决方法以及简短的处理结果。有名称的模式能立即增加我们的设计词汇,让我们在一个更高层的抽象上做设计,可以和同事谈论,还可以在文档中使用这些词汇。我们能轻易的思考它们,还能与其他人交流。在我们编目分类时,为每个模式取一个合适的名称都成了很艰难的一部分。

2. 模式应用的问题场景。它负责解释问题场景,它可能会描述特定的设计问题,比如用对象来表示算法。也可能描述不灵活设计中的类或对象的结构。有时,当针对某些问题时,需要满足一系列的条件才能应用相应的模式。        

3. 模式中的解决方案。它负责解释内部的关系,职责以及协作方式。方案不会描述特定的具体的设计或实现,因为模式就像一种模板,它可以应用在许多不同的场景中。相反,模式提供了一种抽象的描述以及一种通用的元素(类和对象)的组织。

4. 模式的处理结果。当我们描述设计决策时,即使它的结果微不足道,但是这些结果对于评估设计以及应用模式后产生的代价和收益却很关键。对于软件的影响结果常常会在时间和空间上权衡,有可能会带来编程语言的更改或造成其他实现问题。由于在面向对象的软件设计中,重用是很重要的考虑因素,对于模式的应用,其产生的影响就应该考虑系统的灵活性、可扩展性以及可移植性。把这些影响结果清晰的列出来有助于你理解和评估他们。

 

一个人的观点可影响模式具体的解释,某个人自己创建的模式可能成为另一个人的原始基础。对于本书,我们关注的模式是抽象的,这些模式主要描述在特定的应用场景中,通过自定义类和对象来解决常规的设计问题。

对于可复用的面向对象的设计,设计模式提供了名称,问题的抽象,还有结构中关键的因素。设计模式可以确定系统中的类和实例,定义他们的角色和协作关系还有责任的分配,每种模式都关注特定的设计问题,描述了使用该模式后的一些限制以及产生的影响结果。由于,最终我们必须要实现我们的设计,我们提供了C++和SmallTalk版本的代码来作为演示。

即使设计模式描述的是面向对象的设计,但他们是基于主流的面向对象语言的,我们选择C++的原因是:经验源于此,而且他们也很常用。

编程语言的选择是非常重要的,因为它可以影响一个人的认知观点。我们的模式语言假设是拥有Smalltalk/C++的特征,因此这也决定了是否能实现相应的功能。如果我们选用过程语言,我们依然会在模式中涵盖继承、封装、多态这些语义于,同样,其他的面向对象语言也是支持这些模式的。比如,CLOS(公共Lisp对象系统,Common Lisp Object System)有多方法机制,这种特征会造成访问者模式的不便。事实上,Smalltalk和C++有很多不同,这足以容易的表达和区分我们的设计模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值