<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>
<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>
>外观是一个对象,它为较大的代码(例如类库)提供简化的接口。立面可以:>
- 使软件库更易于使用,理解和测试,因为立面具有方便的常见任务方法; 出于相同的原因,
使库更易读;- >
>减少库内部工作的外部代码的依赖关系,因为大多数代码都使用该立面在开发系统时更灵活;- 包裹一个设计良好的API集合,具有一个精心设计的API。 这是我们库示例的类图,该示例标识了立面模式定义中提到的组件。
现实世界实施
在前面的部分中,我们以图书馆系统为例了解了立面模式背后的理论。在现实世界中,立面可能比我们图书馆场景中的实施更为复杂。让我们回顾一下现实应用程序和库中该模式的一些实现。opauth用于打开身份验证
我最近写了一篇有关一个流行的公开身份验证库的文章,称为Opauth,建议您阅读,如果您还没有阅读。假设我们已经开发了一个专业的社交网站,希望我们的用户能够使用其他受欢迎的网站,例如Twitter,LinkedIn和Facebook进行身份验证。为了完成身份验证过程,我们使用现有的第三方库来访问网络的服务。让我们看一些带有Twitter库的示例代码,以实现所需的功能。如您所见,我们调用一组特定于Twitter的库方法来实现所需的功能。 LinkedIn和Facebook都需要类似的方法。该过程已经变得复杂。我们没有开发Twitter,Facebook或LinkedIn应用程序;我们应该只验证凭据并验证用户。我们的应用程序不必担心这些服务的实施。 我们可以通过使用Opauth库作为立面接口来解决此问题。首先,我们需要以通用格式指定所需服务的登录URL,以通过Opauth插件标识。考虑以下用于实施身份验证过程的代码。<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>登录后复制登录后复制登录后复制一旦请求登录链接,Opauth就会从URL标识所请求的服务,并初始化库以重定向用户进行身份验证。现在,我们的应用程序只需要创建登录链接并调用初始化方法。所有复杂的身份验证内容均使用每个服务的各个库来处理幕后。这可以被认为是有效使用立面模式的完美示例。<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>登录后复制登录后复制WordPress meta函数
考虑到其代码的质量,WordPress并不是严重的PHP开发人员中最受欢迎的框架之一。但是我们可以轻松地在WordPress代码库中找到许多成功的立面实现。在这里,我将查看update_post_meta()函数,以保存WordPress帖子的自定义数据。 WordPress允许我们创建与现有帖子关联的自定义字段。考虑一下我们如何在通常情况下保存这些领域……我们必须执行以下所有任务:保存一个自定义字段的工作是很多工作! WordPress通过提供称为update_post_meta()的内置功能来隐藏保存这些字段的复杂性 充当立面。这使我们能够专注于传递与应用程序相关的必要数据;所有上述任务都隐藏在用户中。 现在,考虑实现Update_post_meta()以将其功能识别为立面:
- 验证字段数据
- >过滤HTML标签,脚本和SQL注入的数据
- 检查数据库中的字段的存在
- >根据存在状态
保存或更新记录仅显示必要的代码; update_metadata()函数的完整源代码可在wp-rudes目录内的meta.php文件中找到。但是,您可以在此处看到所有验证,过滤和数据库更新,并且只有立面界面才有有关详细信息的知识。<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>登录后复制登录后复制登录后复制结论
立面是软件开发中最简单,最易于使用的设计模式之一。在本文中,我讨论了外墙模式的各种实现。现在是时候在下面的评论中分享您的经验了。您知道使用外墙的图书馆或服务吗?随意分享您遇到的立面模式的实际实现。 通过fotolia 图像 经常询问有关立面模式的问题>
>软件设计中立面模式的主要目的是什么?> >外墙模式是一种结构设计模式,可为复杂的类,库或框架系统提供简化的接口。它隐藏了系统的复杂性,并从客户端可以访问系统的地方为客户端提供了一个接口。该模式涉及一个单一类,该类提供客户端要求的简化方法,并代表呼叫对现有系统类的方法的调用。
如何改善代码可读性和可用性?通过为复杂子系统提供简单的接口来改善代码的可读性和可用性。该立面没有直接与几个子系统类打交道,而是用统一接口封装了子系统。这减少了了解子系统所需的学习曲线,并使子系统更易于使用和管理。
您可以提供立面模式的真实示例吗?
外墙模式的使用是使用计算机。打开计算机时,您无需了解内部组件如何共同启动系统。您只需按下电源按钮(立面),复杂的过程发生在幕后。
使用立面模式的优点和缺点是什么?
>
>立面模式的主要优点是,它简化了复杂子系统的接口,从而使客户端更容易使用。它还促进了子系统与其客户之间的脱钩,这可以使系统更易于模块化和更易于维护。但是,潜在的劣势是,如果在外墙中放置过多的功能,立面模式可能会成为瓶颈。它还可以从客户端隐藏子系统的有用功能。>
与其他结构设计模式有何不同?>与其他结构设计模式不同,例如适配器或装饰器模式,哪些结构设计模式(用于添加或更改单个对象的行为,立面模式用于简化复杂的类系统。它提供了一个复杂子系统的简化接口,将子系统的复杂性隐藏在客户端中。
可以将立面模式与其他设计模式一起使用吗?与其他设计模式结合使用。例如,它可以与Singleton模式一起使用,以确保仅创建一个立面实例。它也可以与抽象的工厂模式一起使用,以提供一个简单的接口来创建相关对象的家族。
> 如何有助于最少知识的原理?通过限制对象之间的沟通来促进最少知识(或Demeter定律)的原则。客户只需要与外墙进行通信,而不是与子系统类通信。这样可以降低对象之间的依赖项,从而使系统更稳固,更易于维护。可以在多线程应用程序中使用外观模式吗?多线程应用程序。但是,必须注意确保立面是线程安全的。这可以通过使用锁或信号量等同步机制来防止比赛条件来实现这一点。>
如何影响表面模式? >客户需要与之互动。这可以减少对象创建和方法调用的开销。但是,如果立面变成瓶颈,它可能会对性能产生负面影响。
>>我如何在PHP中实现立面模式?提供复杂子系统的简化接口的立面类。立面类应封装子系统,并将呼吁召集到子系统类。客户应通过立面与子系统互动,而不是直接与子系统类交互。
以上是PHP主|通过立面模式管理复杂性的详细内容。更多信息请关注PHP中文网其他相关文章!