四人帮(GoF)
建筑师克里斯托弗-亚历山大(Christopher Alexander)曾提到如何利用模式来解决常见的设计问题,他最初记录了这一概念。亚历山大提出,设计问题可以连同其建议的解决方案一起被严格记录下来。设计模式最显著的应用就是解决软件设计中的架构问题。
用克里斯托弗-亚历山大自己的话说:
"这种语言的元素是被称为模式的实体。每个模式都描述了一个在我们的环境中反复出现的问题,然后描述了该问题的核心解决方案,这样你就可以无数次地使用这个解决方案,而不会用同样的方法做两次。"
亚历山大在《四人帮》之前就写了一本自己的书,书名叫《模式语言》。在这本书中,亚历山大创造了自己的语言,他创造了 "模式语言 "这个词来描述这种语言;这种语言是由建筑模式的构件组成的。通过利用这些建筑模式,书中提出普通人可以使用这种语言作为框架来改善他们的社区和城镇。书中记载的模式之一是 模式 12,即所谓的 "7000 社区":
“在任何超过 5,000 至 10,000 人的社区中,个人都没有有效的发言权。”
通过使用像这样的问题及其记录的解决方案;这本书最终形成了模式,这些模式试图成为使社区变得更好的基石。
正如我所提到的,亚历山大早于 "四人帮",但他的工作对播下软件设计模式的种子至关重要。
现在,让我们直接来看看被称为 "四人帮" 的作者。
不,我们指的不是 1981 年英国工党的叛逃者,也不是英国的后朋克乐队,而是一本名为《设计模式》(Design Patterns)的书的作者:可重用面向对象软件要素 一书的作者。这本书在软件开发领域极具影响力,在软件工程领域也广为人知。
在该书的第一章,作者从自己的亲身经历出发,讨论了面向对象的软件开发,包括论证软件开发人员应该如何针对接口而不是实现进行编程。这导致代码最终利用了面向对象编程的核心功能。
一个常见的误解是,本书只包含四种设计模式,其实不然;它涵盖了三个基本类别的 23 种设计模式。
让我们来介绍一下这些类别:
-
创建型
-
结构型
-
行为型
下面我们就来逐一分析。
创造性设计模式
创建设计模式涉及对象本身的创建。不使用设计模式对类进行基本实例化可能会导致不必要的复杂性,同时也会产生重大的设计问题。
创建设计模式的主要用途是将类的实例化与实例的使用分开。不使用创造性设计模式可能意味着你的代码更难理解和测试。
依赖注入
依赖注入 是将应用程序所需的依赖关系直接输入对象本身的过程。
John Munsch 在 Stack Overflow 上留下了一个名为 "五岁小孩的依赖注入" 的答案,该答案在 Mark Seeman’s Dependency Injection in .NET 一书中再次发表:
当你自己从冰箱里拿东西时,你可能会带来麻烦。你可能会忘记关门,你可能会拿到爸爸妈妈不想让你拿的东西。你甚至会去找一些我们根本没有的东西,或者是过期的东西。 |
你应该做的是说明自己的需要,"我需要午餐时喝点什么",然后我们会确保你坐下来吃饭时有东西喝。 |
在编写一个类时,很自然会用到其他依赖项,比如数据库模型类。因此,有了依赖注入,你就可以在类对象之外创建数据库模型,并将其注入其中,而不用在类中创建数据库模型。简而言之,我们将客户端的行为与客户端的依赖关系分离开来。
在考虑依赖注入时,让我们概括一下所涉及的四个不同角色:
-
需要注入的服务
-
依赖于被注入的服务的客户端
-
决定客户端如何使用服务的接口
-
注入器负责实例化服务并将其注入到客户端