四人帮(GoF)

建筑师克里斯托弗-亚历山大(Christopher Alexander)曾提到如何利用模式来解决常见的设计问题,他最初记录了这一概念。亚历山大提出,设计问题可以连同其建议的解决方案一起被严格记录下来。设计模式最显著的应用就是解决软件设计中的架构问题。

用克里斯托弗-亚历山大自己的话说:

"这种语言的元素是被称为模式的实体。每个模式都描述了一个在我们的环境中反复出现的问题,然后描述了该问题的核心解决方案,这样你就可以无数次地使用这个解决方案,而不会用同样的方法做两次。"
— Christopher Alexander

亚历山大在《四人帮》之前就写了一本自己的书,书名叫《模式语言》。在这本书中,亚历山大创造了自己的语言,他创造了 "模式语言 "这个词来描述这种语言;这种语言是由建筑模式的构件组成的。通过利用这些建筑模式,书中提出普通人可以使用这种语言作为框架来改善他们的社区和城镇。书中记载的模式之一是 模式 12,即所谓的 "7000 社区":

“在任何超过 5,000 至 10,000 人的社区中,个人都没有有效的发言权。”

通过使用像这样的问题及其记录的解决方案;这本书最终形成了模式,这些模式试图成为使社区变得更好的基石。

正如我所提到的,亚历山大早于 "四人帮",但他的工作对播下软件设计模式的种子至关重要。

现在,让我们直接来看看被称为 "四人帮" 的作者。

不,我们指的不是 1981 年英国工党的叛逃者,也不是英国的后朋克乐队,而是一本名为《设计模式》(Design Patterns)的书的作者:可重用面向对象软件要素 一书的作者。这本书在软件开发领域极具影响力,在软件工程领域也广为人知。

在该书的第一章,作者从自己的亲身经历出发,讨论了面向对象的软件开发,包括论证软件开发人员应该如何针对接口而不是实现进行编程。这导致代码最终利用了面向对象编程的核心功能。

一个常见的误解是,本书只包含四种设计模式,其实不然;它涵盖了三个基本类别的 23 种设计模式。

让我们来介绍一下这些类别:

  • 创建型

  • 结构型

  • 行为型

下面我们就来逐一分析。

创造性设计模式

创建设计模式涉及对象本身的创建。不使用设计模式对类进行基本实例化可能会导致不必要的复杂性,同时也会产生重大的设计问题。

创建设计模式的主要用途是将类的实例化与实例的使用分开。不使用创造性设计模式可能意味着你的代码更难理解和测试。

依赖注入

依赖注入 是将应用程序所需的依赖关系直接输入对象本身的过程。

John Munsch 在 Stack Overflow 上留下了一个名为 "五岁小孩的依赖注入" 的答案,该答案在 Mark Seeman’s Dependency Injection in .NET 一书中再次发表:

当你自己从冰箱里拿东西时,你可能会带来麻烦。你可能会忘记关门,你可能会拿到爸爸妈妈不想让你拿的东西。你甚至会去找一些我们根本没有的东西,或者是过期的东西。

你应该做的是说明自己的需要,"我需要午餐时喝点什么",然后我们会确保你坐下来吃饭时有东西喝。

在编写一个类时,很自然会用到其他依赖项,比如数据库模型类。因此,有了依赖注入,你就可以在类对象之外创建数据库模型,并将其注入其中,而不用在类中创建数据库模型。简而言之,我们将客户端的行为与客户端的依赖关系分离开来。

在考虑依赖注入时,让我们概括一下所涉及的四个不同角色:

  • 需要注入的服务

  • 依赖于被注入的服务的客户端

  • 决定客户端如何使用服务的接口

  • 注入器负责实例化服务并将其注入到客户端

结构设计模式

结构设计模式相当容易解释,它是实体之间的互连器。所有结构设计模式都涉及对象之间的相互联系。

行为设计模式

行为设计模式用于解释对象之间如何交互,如何在每个对象之间发送信息,以及如何在类之间划分各种任务的步骤。

结构模式描述的是设计的静态架构;行为模式则更加流畅,描述的是一个流动的过程。

架构模式

严格来说,这并不是一种 设计模式(但 "四人帮" 在他们的书中并没有涉及架构模式);但由于 PHP 面向网络的特性,它与 PHP 开发人员的关系非常密切。架构模式通过解决性能限制、高可用性以及业务风险最小化等问题来解决计算机系统中的各种不同限制。

说到网络框架,大多数开发人员都会熟悉 模型-视图-控制器 架构,但最近开始出现了其他架构;例如,微服务架构由一组独立且相互连接的 RESTful API 组成。有些人认为,微服务将问题从软件开发层转移到了系统架构层。与微服务相反的架构通常被称为单体架构,即所有代码都集中在一个应用程序中。

总结

在本章中,我们修订了一些 PHP 原理,包括 OOP 原理。我们还修订了一些 PHP 语法基础。我们已经了解了如何使用 Composer 进行 PHP 中的依赖管理。除此之外,我们还讨论了 PSR 标准,以及如何在自己的代码中实现这些标准,使自己的代码更容易被他人阅读,并符合其他一些重要的标准(无论是自动加载还是 HTTP 消息传递)。最后,我们介绍了设计模式和四人帮,以及设计模式背后的历史。