1.1 设计模式是什么

1.1.1 什么是模式

从字面上理解,模,就是模型、模板的意思;式,就是方式、方法的意思。综合起来,所谓模式就是:可以作为模型或模板的方式或方法。再简单点说就是可以用来作为样板的方式或方法,类似于大家所熟悉的范例。

1.1.2 设计模式的概念

按照上面的理解,设计模式指的就是设计方面的模板,也即设计方面的方式或方法。

设计模式:是指在软件开发中,经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案。

1.设计模式是解决方案

根据上面对设计模式的定义可以看出,归根结底,设计模式就是一些解决方案。

所谓解决方案,就是解决办法,亦即是解决问题的方式或方法。通常所说的方案书,就是把解决方法文档化后形成的文档。

那么,能不能反过来说:解决方案就是设计模式呢?很明显是不行的。为什么呢?因为在解决方案之前还有一些定语,只有满足这些条件的解决方案才被称为设计模式。

下面就一个个来看。

2.设计模式是特定问题的解决方案

为什么要限制设计模式是“特定问题”的解决方案呢?

限制“特定问题”,说明设计模式不是什么万能灵药,并不是什么问题都能解决,通常一个设计模式仅仅解决某个或某些特定的问题,并不能包治百病。

因此不要迷信设计模式,也不要泛滥使用设计模式,设计模式解决不了那么多问题,它只是解决“特定问题”的解决方案。

3.设计模式是重复出现的、特定问题的解决方案

那么为何要这些特定问题是“重复出现”的呢?

只有这些特定问题“重复出现”,那么为这些问题总结解决方案才是有意义的行为。因为只有总结了这些问题的解决方案,当这些问题再次出现的时候,就可以复用这些解决方案,而不用从头来寻求解决办法了。

4.设计模式是用于解决在特定环境下、重复出现的、特定问题的解决方案

为什么要限制在“特定环境下”呢?

任何问题的出现都是有场景的,不能脱离环境去讨论对问题的解决办法,因为不同环境下,就算是相同的问题,解决办法也不一定是一样的。

5.设计模式是经过验证的,用于解决在特定环境下、重复出现的、特定问题的解决方案,为什么要限制是“经过验证的”呢?

每个人都可以总结一些用于解决在特定环境下、重复出现的、特定问题的解决方案,但并不是每个人总结的解决方案都算得上是设计模式,这些解决方案应该要有足够的应用来验证,并得到大家的认可和公认。只有经过验证的解决方案才算得上是设计模式。

没有得到验证的解决方案,假如也算设计模式而被大家大量复用的话,万一这个方案有问题呢?那么所有应用它的地方都会出错,都应该修改,这种复用还不如不用呢。

6.为何要强调“在软件开发中”

原因很简单,因为接下来要讨论的内容,就是软件开发中的设计模式,因此这里限制“在软件开发中”。

注意

并不能说设计模式是软件行业独有的,事实上,很多行业都有自己的设计模式。

1.1.3 设计模式的理解

通过上面对设计模式概念的讲述,可以看出,设计模式也没有什么神奇之处,下面对设计模式再做几点说明,使读者进一步理解它。

■ 设计模式是解决某些问题的办法。

要理解和掌握设计模式,其重心就在于对这些办法的理解和掌握,然后进一步深化到这些办法所体现的思想层面上,将设计模式所体现的思考方式进行吸收和消化,融入到自己的思维中。

■ 设计模式不是凭空想象出来的,是经验的积累和总结。

从理论上来说,设计模式并不一定是最优秀的解决方案,有可能存在比设计模式更优秀的解决方案,也就是说设计模式是相对优秀的,没有最优,只有更优。

延伸

这也说明,从理论上,我们自己也可以总结一些这样的解决方案,如果能得到大家的认可和验证,也是有可能成为公认的设计模式的。

■ 设计模式并不是一成不变的,而是在不断发展中。

本书仅仅讨论GoF的著作中所记载的、经典的设计模式,但并不是说只有这些设计模式。因为设计模式的发展从设计模式引入软件中以来,就从来没有停止过。

■ 设计模式并不是软件行业独有的,各行各业都有自己的设计模式。

用大家身边的例子来说,比如医药行业,就有自己的设计模式。假设一个人感冒了,到药店买感冒药,这个感冒药就是设计模式的一个很好体现。

◆ 经过验证的:药品上市前,会有大量的验证和实验,以保证药品的安全性。

◆ 特定环境下;这些药品是针对人的,不是针对其他动物的。

◆ 重复出现的:正是因为感冒会重复出现,研制药品才是有意义的。

◆ 特定问题:感冒药只是用来解决感冒问题的,不能解决其他问题,比如脚痛。

◆ 解决方案:药品本身就是该解决方案的具体体现。

经过上面的比较,你会发现,医药行业对设计模式的体现,一点也不逊色于软件行业。再说设计模式本身不是起源于软件行业,而是起源于建筑业。

1.1.4 设计模式的历史

设计模式起源于建筑行业,一位名叫Alexander的建筑师发现并总结了一些建筑行业的设计模式。

在20世纪90年代,准确地说是1995年,由于Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides合著的《设计模式——可复用面向对象软件的基础》一书的出版,正式掀开了软件业设计模式的序幕,这本书的四位作者被世人称为四人组,也有人将其称为“四人帮”,也就是大家常见的GoF(Gang of Four)。