Laravel框架中外觀模式的深入解析
laravel框架中的外觀模式(Facade Pattern)是外部與一個子系統的通訊必須透過一個統一的外觀物件進行,為子系統中的一組介面提供一個一致的介面,外觀模式定義了一個高層接口,這個接口使得這個子系統更容易使用。外觀模式又稱為門面模式,它是一種物件結構型模式。
Laravel中我們常用到的Route
、Redis
、Auth
這些Facade就是外觀模式的具體實現, 在Laravel中設計了多個外觀類,每個外觀類別繼承自統一的抽像外觀類,在抽像外觀類別裡提供了透過外觀類別存取其背後子系統的基礎方法。
對於新的業務需求,不要修改原有外觀類,而應該增加一個新的具體外觀類,由新的具體外觀類來關聯新的子系統對象,同時通過修改配置文件來達到不修改原始程式碼並更換外觀類別的目的。
下面是一個簡單的外觀模式的例子,並沒有引入抽像外觀類,在介紹Laravel Facade的文章中我們會看到Laravel裡提供了一個抽像外觀類從而讓我們能夠方便的根據需要增加新子系統的外觀類,並讓外觀類別能夠正確代理到其對應的子系統(或叫服務)。
模式結構
外觀模式包含以下角色:
Facade 外觀角色
-
SubSystem 子系統角色
#程式碼範例
<?php class Client { public function main() { (new Facade)->operation(); } } class Facade { private $systemA; private $systemB; public function __construct() { $this->systemA = new SystemA; $this->systemB = new SystemB; } public function operation() { $this->systemA->operationA(); $this->systemB->operationB(); } } class SystemA { public function operationA() { // } } class SystemB { public function operationB() { // } }
模式分析
根據“單一職責原則”,在軟體中將一個系統劃分為若干個子系統有利於降低整個系統的複雜性,一個常見的設計目標是使子系統間的通信和相互依賴關係達到最小,而達到該目標的途徑之一就是引入一個外觀對象,它為子系統的存取提供了一個簡單而單一的入口。 -外觀模式也是「迪米特法則」的體現,透過引入一個新的外觀類別可以降低原有系統的複雜度,同時降低客戶類別與子系統類別的耦合度。 - 外觀模式要求一個子系統的外部與其內部的通訊透過一個統一的外觀物件進行,外觀類別將客戶端與子系統的內部複雜性分隔開,使得客戶端只需要與外觀物件打交道,而不需要與子系統內部的許多物件打交道。 -外觀模式的目的在於降低系統的複雜程度。 -外觀模式從很大程度上提高了客戶端使用的便利性,使得客戶端無須關心子系統的工作細節,透過外觀角色即可呼叫相關功能。
缺點
外觀模式的缺點
不能很好地限制客戶使用子系統類,如果對客戶存取子系統類別做太多的限制則減少了可變性和靈活性。
在不引入抽像外觀類別的情況下,增加新的子系統可能需要修改外觀類別或客戶端的原始程式碼,違反了「開閉原則」。
模式擴展
-
一個系統有多個外觀類別
在外觀模式中,通常只需要一個外觀類,而此外觀類別只有一個實例,換言之它是一個單例類別。在許多情況下為了節約系統資源,一般將外觀類別設計為單例類別。當然這並不意味著在整個系統裡只能有一個外觀類,在一個系統中可以設計多個外觀類,每個外觀類都負責和一些特定的子系統交互,向用戶提供相應的業務功能。
-
不要試圖透過外觀類別為子系統增加新行為
不要透過繼承外觀類別在子系統中加入新的行為,這種做法是錯誤的。外觀模式的用意是為子系統提供一個集中化和簡化的溝通管道,而不是向子系統加入新的行為,新的行為的增加應該透過修改原有子系統類別或增加新的子系統類別來實現,不能透過外觀類別來實現。
-
抽像外觀類別的引入
外觀模式最大的缺點在於違背了“開閉原則”,當增加新的子系統或移除子系統時需要修改外觀類,可以透過引入抽像外觀類別在一定程度上解決該問題,客戶端針對抽像外觀類別進行程式設計。對於新的業務需求,不修改原有外觀類,而對應增加一個新的具體外觀類,由新的具體外觀類來關聯新的子系統對象,同時通過修改配置文件來達到不修改源代碼並更換外觀類別的目的。
總結
在外觀模式中,外部與子系統的通訊必須透過一個統一的外觀物件進行,為子系統中的一組接口提供一個一致的介面,外觀模式定義了一個高層接口,這個接口使得這個子系統更容易使用。外觀模式又稱為門面模式,它是一種物件結構型模式。
外觀模式包含兩個角色:外觀角色是在客戶端直接呼叫的角色,在外觀角色中可以知道相關的(一個或多個)子系統的功能和責任,它將所有從客戶端發來的請求委派到相應的子系統去,傳遞給相應的子系統對象處理;在軟體系統中可以同時有一個或者多個子系統角色,每個子系統可以不是一個單獨的類,而是一個類別的集合,它實現子系統的功能。
外觀模式要求一個子系統的外部與其內部的通訊透過統一的外觀物件進行,外觀類別將客戶端與子系統的內部複雜性分隔開,使得客戶端只需要與外觀物件打交道,而不需要與子系統內部的許多物件打交道。
外觀模式主要優點在於對客戶屏蔽子系統元件,減少了客戶處理的物件數目並使得子系統使用起來更加容易,它實現了子系統與客戶之間的松耦合關係,並降低了大型軟體系統中的編譯依賴性,簡化了系統在不同平台之間的移植過程;其缺點在於不能很好地限制客戶使用子系統類,而且在不引入抽像外觀類的情況下,增加新的子系統可能需要修改外觀類別或客戶端的原始程式碼,違反了「開閉原則」。
外觀模式適用情況包括:要為一個複雜子系統提供一個簡單介面;客戶程式與多個子系統之間存在很大的依賴性;在層次化結構中,需要定義系統中每一層的入口,使得層與層之間不會直接產生聯繫。
以上就是本篇文章的全部內容,更多請關注laravel框架入門教學。
相關文章推薦:
Laravel本地環境搭建:Homestead開發環境的部署
相關課程推薦:
以上是Laravel框架中外觀模式的深入解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

Laravel郵件發送失敗時的退信代碼獲取方法在使用Laravel開發應用時,經常會遇到需要發送驗證碼的情況。而在實�...
