一、设计和架构模式基础

编程其实是一种生活方式,而不是工作。这是一种激烈的精神活动。世界上最好的开发人员全天候思考他们的工作。当他们不在办公桌前时,他们会想出最好的主意。一般来说,他们最好的工作是在远离键盘的地方完成的。

由于开发人员需要从不同的角度来看待问题,软件项目不能通过在办公室花更多的时间或增加更多的人来加速。发展不仅仅是时间表和分配的任务。如果你去参观谷歌、IBM 等世界知名软件公司的开发中心,你会发现对于开发者来说,有很多远离键盘的机会。编程问题必须在现实世界的背景下考虑。所以,发明面向对象编程是为了让我们狩猎采集者的大脑更本能地编写软件;也就是说,软件组件承担了现实世界中对象的属性和行为。当寻找问题的解决方案或实现我们想要的方法时,我们通常希望找到一种可重用、优化和廉价的方法。作为开发人员,我们有一些标准的方法来处理编程中一些经常出现的问题,这些问题被称为设计模式。

当你遇到某些反复出现的问题时,你会试图找到任何人都可以使用的解决方案。这个概念在任何地方都很普遍——机械、建筑,甚至人类行为。编程绝对不例外。

编程解决方案取决于问题的需要,并且会进行相应的修改,因为每个问题都有其独特的条件。现实生活和编程生活中都存在经常性的问题。因此,设计模式被给予我们来实现我们的项目。这些模式已经被许多其他开发人员测试并用于成功解决类似的问题。使用设计模式也使得使用干净、标准化和可读的代码成为可能。决定写一个做 X 但使用 Y 模式的程序是一个灾难的处方。它可能适用于像hello world这样的程序,适合演示模式的代码构造,但不适合其他程序。

通过模式,我们还可以找到一种方法来解决语言可能存在的低效问题。此外,这里需要注意的是,低效率通常与消极有关,但不一定总是不好的。

在本书中,我们将介绍使用 Laravel PHP 框架的 PHP 设计模式。在前几章中,我们还将给出来自 Laravel 核心代码的例子。在接下来的章节中,我们将讨论 MVC 模式的基础。然后,我们将尝试检查 Laravel 的 MVC 模式方法和常见的 MVC 方法之间的差异。我们希望这本书能帮助你提高代码质量。

请注意,找到最佳稳定、高质量的解决方案直接取决于您对平台和语言的了解。我们强烈建议您精通 PHP 和 Laravel 框架中的数据类型和面向对象编程的基础。

在本章中,我们将解释设计模式术语,并了解这些设计模式及其元素的分类。我们将从包含框架中使用的设计模式的 Laravel 核心代码中给出一些例子。最后,我们将解释模式-视图-控制器 ( MVC )架构模式及其好处。

设计图案

设计模式最早是由埃里克·伽马和他的三个朋友在 1994 年介绍的。设计模式基本上是在多个项目上实现的软件设计模式,它的预期成功给出了一个证明这种模式是常见重复问题的解决方案的想法。

设计模式是解决问题的方法,也是以最佳方式获得预期结果的方法。因此,设计模式不仅是创建一个大的和健壮的系统的方法,而且它们还以友好的方式提供了伟大的架构。

在软件工程中,设计模式是对软件设计中给定上下文中常见问题的一般可重复和优化的解决方案。它是如何解决问题的描述或模板,解决方案可以在不同的情况下使用。以下是使用设计模式的一些好处:

  • 维护
  • 证明文件
  • 可读性
  • 容易找到合适的对象
  • 易于确定对象粒度
  • 轻松指定对象接口
  • 即使对于大型软件项目也易于实现
  • 实现代码可重用性概念

如果你不熟悉设计模式,开始理解的最好方法是观察我们用来解决日常生活中常见的 T2 问题的方法。

让我们看看下面的图片:

Design patterns

世界上有许多不同类型的电源插头。因此,我们需要一个可重复使用、优化且比购买不同电源插头类型的新设备更便宜的解决方案。简单来说,我们需要一个适配器。请看下面的适配器图片:

Design patterns

在这种情况下,适配器是可重用、优化和廉价的最佳解决方案。但是,当我们的汽车车轮爆裂时,适配器并不能为我们提供解决方案。

在面向对象的语言中,我们程序员使用对象来做我们想做的任何事情,以获得我们想要的结果。因此,我们有许多类型的对象、情况和问题。这意味着我们需要不止一种方法来解决不同类型的问题。

设计模式的要素

以下是设计模式的元素:

  • 名称:这是一个我们可以用来描述问题的手柄
  • 问题:这个描述了什么时候应用模式
  • 解决方案:这个描述了元素、关系、责任和协作,我们遵循这种方式来解决问题
  • 结果:这详细说明了应用模式的结果和权衡

设计模式分类

设计模式一般分为三个基本组:

  • 创造模式
  • 结构模式
  • 行为模式

让我们在下面的小节中研究这些。

创造模式

创造模式是软件开发领域中设计模式的子集;它们用来创造物体。它们将对象的设计与其表示分离。对象创建被封装和外包(例如,在工厂中),以保持对象创建的上下文独立于具体的实现。这符合规则:“程序在接口上,而不是实现上。”

创造模式的一些特征如下:

  • 泛型实例化:这个允许在系统中创建对象,而不必在代码中识别特定的类类型(抽象工厂和工厂模式)
  • 简单性:一些模式使得对象创建变得更加容易,因此调用者将不必编写大量复杂的代码来实例化对象(构建器(管理器)和原型模式)
  • 创造约束:创造模式可以限制谁可以创造物体,它们是如何被创造的,以及它们是何时被创造的

以下模式被称为创造模式:

  • 抽象工厂模式
  • 工厂模式
  • 构建器(管理器)模式
  • 原型模式
  • 单一模式

结构模式

在软件工程中,设计模式结构模式便于各种实体之间的通信。

样品的结构的一些例子如下:

  • 组合:这个将对象组合成一个树形结构(整个层次)。组合允许客户根据其组合被统一地视为单个对象。
  • 装饰器:这个动态的给一个对象添加选项。装饰器是扩展功能的灵活的替代实施例。
  • 苍蝇:这是防止生产过剩的小物件(无条件物件)的份额。
  • 适配器:这个把一个类的接口转换成客户端期望的另一个接口。适配器允许这些类一起工作,而这些类通常由于接口不同而无法一起工作。
  • 门面:这个提供了一个统一的接口,满足一个子系统的各种接口。Facade 定义了一个更高级别的子系统接口,更容易使用。
  • 代理:这个实现了对控制原始对象访问的另一个对象的替换(代理)。
  • :这个把一个抽象和它的实现分开,然后可以独立地改变它。

行为模式

行为模式都是关于一个类‘对象’的交流。行为模式是那些与对象之间的通信最相关的模式。以下是行为模式的列表:

  • 责任链模式
  • 命令模式
  • 解释器模式
  • 迭代器模式
  • 中介模式
  • 纪念品图案
  • 观察者模式
  • 状态模式
  • 战略模式
  • 模板模式
  • 访客模式

我们将在接下来的章节中介绍这些模式。如果您想了解 Laravel 内核中一些模式的用法,请看下面的列表:

  • 建筑商(经理) 图案 : Illuminate\Auth\AuthManagerIlluminate\Session\SessionManager
  • 工厂T5 图案:Illuminate\Database\DatabaseManagerIlluminate\Validation\Factory
  • 仓库T5 模式:Illuminate\Config\RepositoryIlluminate\Cache\Repository
  • 战略T5 模式:IIlluminate\Cache\StoreInterfaceIlluminate\Config\LoaderInterface
  • 供应商T4模式 : IIlluminate\Auth\AuthServiceProviderIlluminate\Hash\HashServiceProvider

什么是 MVC?

MVC 三元组的类在 1988 年被用来在 Smaltalk-80 中构建用户界面。MVC 是软件工程中使用的一种架构模式,其基本原理是基于应用的逻辑应该与其表示分离的思想。它将一个给定的软件应用分成三个相互关联的部分,以便将信息的内部表示与信息呈现给用户或从用户接受信息的方式分开。请参考下图:

What is MVC?

在上图中,您将看到 MVC 的元素。它显示了基于 MVC 的请求应用的一般生命周期。如您所见,在项目中使用 MVC 架构模式允许您分离应用的不同层,例如数据库层和用户界面层。

使用 MVC 模式的好处如下:

  • 不同的视图和控制器可以替代,为同一模型提供替代的用户界面。
  • 它提供同一模型的多个同时视图。
  • 变更传播机制确保所有视图同时反映模型的当前状态。
  • 只影响应用用户界面的更改变得更加容易。
  • 测试应用的核心更容易,因为它是由模型封装的。
  • MVC 模式的一大好处是,当你使用不同的模板时,它允许你回收应用的逻辑。例如,当您想要在应用的一部分中实现外部应用编程接口时,重用应用的逻辑将非常有帮助。如果完全遵循 Laravel 的 MVC 方法,您将只需要修改控制器来呈现许多不同的模板/视图。

总结

在本章中,我们已经解释了设计模式的基础。我们还介绍了一些在 Laravel 框架中使用的设计模式。最后,我们解释了 MVC 架构模式的概念及其好处。

在下一章中,我们将深入讨论 MVC 概念及其在 Laravel 中的使用。在继续学习设计模式及其在 Laravel 中的实际代码使用之前,最重要的是理解框架对 MVC 概念的方法。