首页 > 后端开发 > php教程 > PHP主|通过立面模式管理复杂性

PHP主|通过立面模式管理复杂性

Jennifer Aniston
发布: 2025-02-24 08:25:09
原创
544 人浏览过

PHP主|通过立面模式管理复杂性

设计模式旨在将解决方案标准化软件开发中面临的常见问题。当我们开发复杂的应用程序时,我们应该分配足够的时间来计划应用程序的设计和结构。当我们这样做时,我们有机会选择适当的设计模式。但是在某些情况下,我们甚至不知道我们正在使用设计模式。 立面是几乎每个Web应用程序中使用的设计模式,但通常不知道。 “设计模式”一词创造了一种复杂且难以理解的心理形象。即使有时这可能是正确的,但立面模式也很容易实现。让我们看看什么是立面以及它有助于我们编写良好代码的作用。

钥匙要点

  • 外观是几乎每个Web应用程序中使用的设计模式,可简化复杂的流程并允许更精简的用户体验。
  • >外观模式隐藏了系统的复杂性并提供了简化的界面,并遵守了最小知识的原理,在该原理中,每个单元应该对其他单位具有最小的知识。
  • >外墙模式的现实应用程序包括Opauth库,该库充当第三方身份验证服务的立面接口和WordPress的Update_post_meta()函数,该功能是保存WordPress帖子的自定义数据的外墙。 🎜>
  • >外墙模式是有益的,因为它可以提高代码的可读性和可用性,促进子系统与其客户之间的脱钩,并简化了复杂子系统的接口。但是,如果将过多的功能放入外墙,它可能会成为瓶颈,并可能从客户端隐藏子系统的有用功能。
  • >
  • 借书的过程
  • 假设我们正在开发图书馆管理系统的应用程序。借贷和返回书籍显然是此类系统中最重要的两个任务。但是考虑借贷过程的典型实施:

用户来图书馆并返回借书的书,以便她可以借用新书。

用户必须为逾期书籍支付罚款。
  • 用户或图书馆工作人员的成员搜索一本新书。
  • >
  • 如果上述步骤成功完成,则必须检索书的位置。
  • 用户借这本书。
  • 本书的状态在系统中不可用。
每个任务的实现都包含在具有自己的接口的单独类中。以下代码说明了系统如何通过调用必要的方法借书:
<span><span><?php
</span></span><span><span>public class User
</span></span><span><span>{
</span></span><span>    <span>public function borrowBook() {
</span></span><span>        <span>$bookManager = new Book_Manager();
</span></span><span>        <span>$bookManager->returnBooks();
</span></span><span>
</span><span>        <span>$bookPayments = new Book_Payments();
</span></span><span>        <span>if ($bookPayments->hasOverdueBooks()) {
</span></span><span>            <span>$bookPayments->payBookFines();
</span></span><span>        <span>}
</span></span><span>
</span><span>        <span>$bookLibrary = new Book_Library();
</span></span><span>        <span>$bookReservations = new Book_Reservations();
</span></span><span>
</span><span>        <span>$book = $bookLibrary->searchBooks();
</span></span><span>        <span>$isAvailable = $bookLibrary->isBookAvailable($book);
</span></span><span>        <span>$isReserved = $bookReservations->isBookReserved($book); 
</span></span><span>        <span>if ($isAvailable && !isReserved) {
</span></span><span>            <span>$bookLibrary->locateBook($book);
</span></span><span>
</span><span>            <span>$bookManager->borrowBook($book);
</span></span><span>            <span>$bookLibrary->updateBookAvailability($book, $status);
</span></span><span>        <span>}
</span></span><span>    <span>}
</span></span><span><span>}</span></span>
登录后复制
登录后复制
登录后复制
您可以看到借书的过程实际上是一个复杂的过程!在此实施中,用户必须与四个不同类别和大约十种方法进行交互才能借书。 假设每个功能都被用作应用程序中的单独屏幕。您能想象使用该系统借三本书所需的努力吗?借款人不需要了解诸如检查预订和更新状态之类的功能。我们的实施肯定有问题。

实施图书馆立面

我们需要将用户从库的复杂工作流程中解脱出来,并允许简化的接口仅与用户直接相关的信息 - 立面直接相关。让我们看看图书馆外墙的实现。
<span><span><?php
</span></span><span><span>class Library_Facade
</span></span><span><span>{
</span></span><span>    <span>public function returnBooks() {
</span></span><span>        <span>// previous implementation by calling necessary classes
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function borrowBooks() {
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function searchBooks() {
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function reserveBooks() {
</span></span><span>    <span>}
</span></span><span><span>}</span></span>
登录后复制
登录后复制
用户可以通过调用brownbook()库库facade类的方法借入书籍,如下所示:
<span><span><?php
</span></span><span><span>class User
</span></span><span><span>{
</span></span><span>    <span>public function borrowBook() {
</span></span><span>        <span>$libraryFacade = new Library_Facade();
</span></span><span>        <span>$libraryFacade->borrowBook();
</span></span><span>    <span>}
</span></span><span><span>}</span></span>
登录后复制
借助此基于立体的实现,用户仅与Library_facade类对话,并且不知道该功能是如何实现的。用户可以直接从立面上索取任何功能,外墙负责处理复杂过程并返回适当的信息。立面模式遵守每个单元应对其他单位具有最低知识的知识的原则。 即使低级功能通过外墙隐藏在用户中,用户仍然可以在需要时直接请求低级类。考虑一下自己的项目,以及您可能在没有意识到的情况下找到实现立面模式的情况。

>外观模式定义

由于我们已经确定了实施立面模式的过程和重要性,因此现在该了解模式的定义了。以下是从Wikipedia中提取的:
>外观是一个对象,它为较大的代码(例如类库)提供简化的接口。立面可以:
    >
  • 使软件库更易于使用,理解和测试,因为立面具有方便的常见任务方法; 出于相同的原因,
  • 使库更易读;
  • >
  • >减少库内部工作的外部代码的依赖关系,因为大多数代码都使用该立面在开发系统时更灵活;
  • 包裹一个设计良好的API集合,具有一个精心设计的API。 这是我们库示例的类图,该示例标识了立面模式定义中提到的组件。
  • 现实世界实施

    在前面的部分中,我们以图书馆系统为例了解了立面模式背后的理论。在现实世界中,立面可能比我们图书馆场景中的实施更为复杂。让我们回顾一下现实应用程序和库中该模式的一些实现。

    opauth用于打开身份验证

    我最近写了一篇有关一个流行的公开身份验证库的文章,称为Opauth,建议您阅读,如果您还没有阅读。假设我们已经开发了一个专业的社交网站,希望我们的用户能够使用其他受欢迎的网站,例如Twitter,LinkedIn和Facebook进行身份验证。为了完成身份验证过程,我们使用现有的第三方库来访问网络的服务。让我们看一些带有Twitter库的示例代码,以实现所需的功能。
<span><span><?php
</span></span><span><span>public class User
</span></span><span><span>{
</span></span><span>    <span>public function borrowBook() {
</span></span><span>        <span>$bookManager = new Book_Manager();
</span></span><span>        <span>$bookManager->returnBooks();
</span></span><span>
</span><span>        <span>$bookPayments = new Book_Payments();
</span></span><span>        <span>if ($bookPayments->hasOverdueBooks()) {
</span></span><span>            <span>$bookPayments->payBookFines();
</span></span><span>        <span>}
</span></span><span>
</span><span>        <span>$bookLibrary = new Book_Library();
</span></span><span>        <span>$bookReservations = new Book_Reservations();
</span></span><span>
</span><span>        <span>$book = $bookLibrary->searchBooks();
</span></span><span>        <span>$isAvailable = $bookLibrary->isBookAvailable($book);
</span></span><span>        <span>$isReserved = $bookReservations->isBookReserved($book); 
</span></span><span>        <span>if ($isAvailable && !isReserved) {
</span></span><span>            <span>$bookLibrary->locateBook($book);
</span></span><span>
</span><span>            <span>$bookManager->borrowBook($book);
</span></span><span>            <span>$bookLibrary->updateBookAvailability($book, $status);
</span></span><span>        <span>}
</span></span><span>    <span>}
</span></span><span><span>}</span></span>
登录后复制
登录后复制
登录后复制
如您所见,我们调用一组特定于Twitter的库方法来实现所需的功能。 LinkedIn和Facebook都需要类似的方法。该过程已经变得复杂。我们没有开发Twitter,Facebook或LinkedIn应用程序;我们应该只验证凭据并验证用户。我们的应用程序不必担心这些服务的实施。 我们可以通过使用Opauth库作为立面接口来解决此问题。首先,我们需要以通用格式指定所需服务的登录URL,以通过Opauth插件标识。考虑以下用于实施身份验证过程的代码。
<span><span><?php
</span></span><span><span>class Library_Facade
</span></span><span><span>{
</span></span><span>    <span>public function returnBooks() {
</span></span><span>        <span>// previous implementation by calling necessary classes
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function borrowBooks() {
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function searchBooks() {
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>public function reserveBooks() {
</span></span><span>    <span>}
</span></span><span><span>}</span></span>
登录后复制
登录后复制
一旦请求登录链接,Opauth就会从URL标识所请求的服务,并初始化库以重定向用户进行身份验证。现在,我们的应用程序只需要创建登录链接并调用初始化方法。所有复杂的身份验证内容均使用每个服务的各个库来处理幕后。这可以被认为是有效使用立面模式的完美示例。

WordPress meta函数

考虑到其代码的质量,WordPress并不是严重的PHP开发人员中最受欢迎的框架之一。但是我们可以轻松地在WordPress代码库中找到许多成功的立面实现。在这里,我将查看update_post_meta()函数,以保存WordPress帖子的自定义数据。 WordPress允许我们创建与现有帖子关联的自定义字段。考虑一下我们如何在通常情况下保存这些领域……我们必须执行以下所有任务:
  • 验证字段数据
  • >过滤HTML标签,脚本和SQL注入的数据
  • 检查数据库中的字段的存在
  • >根据存在状态
  • 保存或更新记录
保存一个自定义字段的工作是很多工作! WordPress通过提供称为update_post_meta()的内置功能来隐藏保存这些字段的复杂性 充当立面。这使我们能够专注于传递与应用程序相关的必要数据;所有上述任务都隐藏在用户中。 现在,考虑实现Update_post_meta()以将其功能识别为立面:
<span><span><?php
</span></span><span><span>public class User
</span></span><span><span>{
</span></span><span>    <span>public function borrowBook() {
</span></span><span>        <span>$bookManager = new Book_Manager();
</span></span><span>        <span>$bookManager->returnBooks();
</span></span><span>
</span><span>        <span>$bookPayments = new Book_Payments();
</span></span><span>        <span>if ($bookPayments->hasOverdueBooks()) {
</span></span><span>            <span>$bookPayments->payBookFines();
</span></span><span>        <span>}
</span></span><span>
</span><span>        <span>$bookLibrary = new Book_Library();
</span></span><span>        <span>$bookReservations = new Book_Reservations();
</span></span><span>
</span><span>        <span>$book = $bookLibrary->searchBooks();
</span></span><span>        <span>$isAvailable = $bookLibrary->isBookAvailable($book);
</span></span><span>        <span>$isReserved = $bookReservations->isBookReserved($book); 
</span></span><span>        <span>if ($isAvailable && !isReserved) {
</span></span><span>            <span>$bookLibrary->locateBook($book);
</span></span><span>
</span><span>            <span>$bookManager->borrowBook($book);
</span></span><span>            <span>$bookLibrary->updateBookAvailability($book, $status);
</span></span><span>        <span>}
</span></span><span>    <span>}
</span></span><span><span>}</span></span>
登录后复制
登录后复制
登录后复制
仅显示必要的代码; update_metadata()函数的完整源代码可在wp-rudes目录内的meta.php文件中找到。但是,您可以在此处看到所有验证,过滤和数据库更新,并且只有立面界面才有有关详细信息的知识。

结论

立面是软件开发中最简单,最易于使用的设计模式之一。在本文中,我讨论了外墙模式的各种实现。现在是时候在下面的评论中分享您的经验了。您知道使用外墙的图书馆或服务吗?随意分享您遇到的立面模式的实际实现。 通过fotolia 图像 经常询问有关立面模式的问题

>

>软件设计中立面模式的主要目的是什么?

>

>外墙模式是一种结构设计模式,可为复杂的类,库或框架系统提供简化的接口。它隐藏了系统的复杂性,并从客户端可以访问系统的地方为客户端提供了一个接口。该模式涉及一个单一类,该类提供客户端要求的简化方法,并代表呼叫对现有系统类的方法的调用。

如何改善代码可读性和可用性?通过为复杂子系统提供简单的接口来改善代码的可读性和可用性。该立面没有直接与几个子系统类打交道,而是用统一接口封装了子系统。这减少了了解子系统所需的学习曲线,并使子系统更易于使用和管理。

您可以提供立面模式的真实示例吗?

外墙模式的使用是使用计算机。打开计算机时,您无需了解内部组件如何共同启动系统。您只需按下电源按钮(立面),复杂的过程发生在幕后。

使用立面模式的优点和缺点是什么?

>

>立面模式的主要优点是,它简化了复杂子系统的接口,从而使客户端更容易使用。它还促进了子系统与其客户之间的脱钩,这可以使系统更易于模块化和更易于维护。但是,潜在的劣势是,如果在外墙中放置过多的功能,立面模式可能会成为瓶颈。它还可以从客户端隐藏子系统的有用功能。

>

与其他结构设计模式有何不同?

>与其他结构设计模式不同,例如适配器或装饰器模式,哪些结构设计模式(用于添加或更改单个对象的行为,立面模式用于简化复杂的类系统。它提供了一个复杂子系统的简化接口,将子系统的复杂性隐藏在客户端中。

可以将立面模式与其他设计模式一起使用吗?与其他设计模式结合使用。例如,它可以与Singleton模式一起使用,以确保仅创建一个立面实例。它也可以与抽象的工厂模式一起使用,以提供一个简单的接口来创建相关对象的家族。

>

如何有助于最少知识的原理?通过限制对象之间的沟通来促进最少知识(或Demeter定律)的原则。客户只需要与外墙进行通信,而不是与子系统类通信。这样可以降低对象之间的依赖项,从而使系统更稳固,更易于维护。

可以在多线程应用程序中使用外观模式吗?多线程应用程序。但是,必须注意确保立面是线程安全的。这可以通过使用锁或信号量等同步机制来防止比赛条件来实现这一点。

>

如何影响表面模式?

>

客户需要与之互动。这可以减少对象创建和方法调用的开销。但是,如果立面变成瓶颈,它可能会对性能产生负面影响。

>

>我如何在PHP中实现立面模式?提供复杂子系统的简化接口的立面类。立面类应封装子系统,并将呼吁召集到子系统类。客户应通过立面与子系统互动,而不是直接与子系统类交互。

以上是PHP主|通过立面模式管理复杂性的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板