外觀模式 (Facade Pattern)

定義:

外觀模式(Facade Pattern)是一種結構型設計模式,它通過提供一個統一的高層接口來簡化復雜子系統或庫的訪問。這種模式的關鍵在于,它創建了一個外觀類,這個類封裝了對子系統的一系列復雜交互,使得子系統更易于使用和理解。

外觀模式的主要特點和目的包括:

  1. 簡化復雜系統的接口:外觀模式為復雜的內部子系統提供了一個簡單的外部接口。這樣,客戶端在使用這些子系統時只需要與外觀類交互,而不需要了解或直接訪問系統的復雜內部工作。
  2. 降低子系統與客戶端之間的耦合度:客戶端通過外觀類與子系統交互,減少了與子系統內部多個模塊的直接依賴。這樣做有助于減少客戶端和子系統之間的耦合,使得系統更易于維護和擴展。
  3. 提高使用便利性:外觀模式通過為復雜子系統提供一個簡單明了的接口,使得客戶端在使用這些系統時更加方便。
解決的問題:
  • 復雜子系統的簡化接口:當一個系統變得非常復雜或難以理解時,外觀模式提供了一個簡單的接口,通過這個接口客戶端可以更容易地訪問和使用這個系統。
  • 客戶端與子系統的解耦:在沒有外觀模式的情況下,客戶端可能需要與多個子系統的多個組件直接交互,這會使客戶端與子系統之間的耦合變得復雜。外觀模式允許客戶端通過一個單一的接口與子系統交互,從而降低耦合度。
  • 易于使用和維護:外觀模式使子系統的使用變得更加簡單直接,這不僅使得客戶端代碼變得更簡潔,也使得維護更加容易,因為大部分依賴都集中在外觀接口上。
  • 隱藏系統的復雜性:外觀模式隱藏了其后的復雜子系統,這樣客戶端就不需要了解這些復雜性。這對于降低整體的復雜性、提高系統的可讀性和可維護性非常有幫助。
  • 隔離變化:如果子系統經常更改,那么可以通過修改外觀類來應對這些變化,從而避免直接影響到使用這些子系統的客戶端。

總的來說,外觀模式提供了一種方式來減少系統的復雜性,并為復雜子系統提供了一個簡潔明了的界面,使子系統更易于使用和維護。

使用場景:
  • 簡化復雜系統的訪問
    • 當系統變得非常復雜或難以理解時,使用外觀模式提供一個簡化的接口,使系統更易于使用和理解。
  • 解耦系統和客戶端代碼
    • 如果你想要降低系統中不同層次或不同子系統之間的依賴關系,可以使用外觀模式作為它們之間的中介。
  • 分層架構
    • 在多層架構的程序中,可以使用外觀作為每一層的入口點,這樣層與層之間的交互只通過這些外觀進行,從而簡化依賴關系。
  • 為復雜子系統提供統一接口
    • 當需要為復雜的子系統提供一個清晰簡單的接口時,外觀模式允許用戶通過一個統一的界面與子系統交互。
  • 封裝遺留代碼或庫
    • 對于舊系統或第三方庫進行封裝,以提供更清晰、更簡單的接口,使得老系統或庫更易于被應用程序使用。
  • 減少編譯依賴
    • 外觀模式可以將一個復雜子系統的依賴集中到一個單一的外觀中,這樣當子系統變化時,只影響到外觀類,而不是所有依賴于子系統的代碼。
  • 隔離代碼
    • 當存在多個可能變化的依賴時,外觀模式可以將這些依賴從客戶端代碼隔離出去,提高子系統的獨立性和可移植性。

外觀模式是一種簡單卻功能強大的模式,特別適合用于簡化復雜系統,減少系統間的耦合,并提高代碼的可維護性和可擴展性。

示例代碼 1 - 簡單外觀模式:
// 子系統類
class SubSystemOne {void methodOne() {System.out.println("SubSystemOne Method");}
}class SubSystemTwo {void methodTwo() {System.out.println("SubSystemTwo Method");}
}class SubSystemThree {void methodThree() {System.out.println("SubSystemThree Method");}
}// 外觀類
class Facade {private SubSystemOne one;private SubSystemTwo two;private SubSystemThree three;public Facade() {one = new SubSystemOne();two = new SubSystemTwo();three = new SubSystemThree();}void methodA() {one.methodOne();two.methodTwo();}void methodB() {two.methodTwo();three.methodThree();}
}
示例代碼 2 - 使用外觀模式簡化接口:
// 復雜系統的各個組件
class CPU {void start() {System.out.println("CPU is starting.");}
}class Memory {void load() {System.out.println("Memory is loading.");}
}class HardDrive {void read() {System.out.println("Reading from hard drive.");}
}// 外觀類
class ComputerFacade {private CPU cpu;private Memory memory;private HardDrive hardDrive;public ComputerFacade() {this.cpu = new CPU();this.memory = new Memory();this.hardDrive = new HardDrive();}public void startComputer() {cpu.start();memory.load();hardDrive.read();System.out.println("Computer started successfully.");}
}
主要符合的設計原則:
  1. 單一職責原則(Single Responsibility Principle):
    • 外觀模式提供了一個統一的接口來訪問子系統,這個接口的職責單一:封裝子系統的復雜性并提供簡單的接口。這樣,子系統本身和外觀之間的關注點是分開的。
  2. 開閉原則(Open-Closed Principle):
    • 外觀模式使得客戶端代碼可以在不修改子系統的代碼的情況下使用子系統。子系統可以獨立于客戶端和外觀類變化和發展,只要外觀的接口保持不變,客戶端代碼不需要做出任何改變。
  3. 最少知識原則(Principle of Least Knowledge)/迪米特法則(Law of Demeter):
    • 外觀模式鼓勵減少系統間的直接交互,客戶端只需要知道外觀接口,不需要了解子系統的內部實現細節,從而減少了系統間的依賴和耦合。

通過使用外觀模式,可以將復雜的系統背后的復雜性隱藏起來,提供簡單的接口,使得客戶端代碼更加清晰、易于理解和維護。同時,這種模式幫助維護系統各部分之間的獨立性和可擴展性。

在JDK中的應用:
  • java.lang.Class:
    • java.lang.Class 類提供了對 Java 反射功能的高級封裝。它隱藏了 Java 反射 API 的復雜性,允許用戶以更簡單的方式處理反射操作,例如獲取類的方法、構造函數、成員變量等。
  • Java數據庫連接(JDBC)API:
    • JDBC API 提供了簡化數據庫操作的接口,封裝了底層的數據庫訪問細節。例如,java.sql.DriverManager 類提供了一個簡化的方法來建立數據庫連接。
  • java.net.URLjava.net.URLConnection:
    • 這些類提供了簡化的方法來處理網絡連接和數據傳輸。用戶可以通過 URL 類的簡單接口來訪問和操作網絡資源,而不需要深入了解底層網絡通信的細節。
  • Java NIO Files API:
    • Java NIO中的 java.nio.file.Files 類提供了一系列靜態方法,用于簡化文件操作,如讀取、寫入、復制和移動文件。這些方法封裝了文件操作的復雜性。

雖然在JDK中這些例子并不總是被標記為外觀模式的經典應用,但它們確實遵循了外觀模式的核心理念:提供簡化的接口來隱藏底層的復雜性,使得復雜的操作對用戶來說更加友好和易于使用。

在Spring中的應用:
  • Spring Web MVC的DispatcherServlet:
    • DispatcherServlet作為前端控制器(Front Controller),為Spring Web MVC提供了一個集中的請求處理機制。它封裝了處理HTTP請求的復雜流程,如路由請求、調用控制器、返回響應等,簡化了Web應用的開發。
  • Spring的JdbcTemplate:
    • JdbcTemplate是Spring提供的一個類,用于簡化JDBC操作。它封裝了創建連接、執行SQL語句、處理結果集等JDBC操作的復雜性,提供了一個更簡潔和易用的接口。
  • Spring Security的配置類:
    • Spring Security的配置類,如WebSecurityConfigurerAdapter,提供了一種簡化的方式來配置安全性相關的各種細節,如認證、授權等。它隱藏了安全性配置的復雜性,使開發者能夠輕松地為應用程序添加安全性功能。
  • Spring Boot的自動配置:
    • Spring Boot的自動配置類似于外觀模式的應用,它封裝了Spring應用程序的常見配置,簡化了Spring應用程序的配置過程。開發者只需少量配置或無需任何配置,即可運行起一個Spring應用程序。

這些例子展示了外觀模式如何在Spring框架中實現,它通過提供簡化的接口和抽象層,隱藏了底層復雜性,使得Spring框架的使用變得更簡單、直觀。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165108.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165108.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165108.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【贈書第7期】從零基礎到精通Flutter開發

文章目錄 前言 1 安裝Flutter和Dart 2 了解Flutter的基礎概念 2.1 Widget 2.2 MaterialApp和Scaffold 2.3 Hot Reload 3 編寫你的第一個Flutter應用 3.1 創建一個Flutter項目 3.2 修改默認頁面 3.3 添加交互 4 深入學習Flutter高級特性 4.1 路由和導航 4.2 狀態管…

python之TCP的網絡應用程序開發

文章目錄 版權聲明python3編碼轉換socket類的使用創建Socket對象Socket對象常用方法和參數使用示例服務器端代碼客戶端代碼 TCP客戶端程序開發流程TCP服務端程序開發流程TCP網絡應用程序注意點socket之send和recv原理剖析send原理剖析recv原理剖析send和recv原理剖析圖 多任務版…

淺談C#在unity應用中的工廠模式

文章目錄 前言簡單工廠模式工廠方法模式抽象工廠模式Unity實戰 前言 工廠模式是一種創建型設計模式,它提供了一種將對象的實例化過程封裝起來的方法,使得客戶端代碼不必直接依賴于具體類。這有助于降低代碼的耦合度,提高代碼的可維護性和可擴…

Python項目打包

Python項目如何打包? 本指南總結了Python項目打包的最佳實踐,主要涉及代碼的打包和分發,以及環境和依賴的管理。 0. 一般項目清單 源代碼(可使用git托管)數據包(可使用DVC托管)Docker環境鏡像…

Python進行threading多線程編程及高級并發處理機制

threading 模塊是 Python 中用于進行多線程編程的標準庫之一。通過 threading 模塊,你可以創建和管理線程,使得程序能夠并發執行多個任務。以下是一些基本的 threading 模塊的用法: 1. 創建線程: 使用 threading.Thread 類可以創…

在兩個java項目中實現Redis的發布訂閱模式

如何在兩個java項目中實現Redis的發布訂閱模式? 1. Redis簡介2. 發布訂閱模式介紹3. 實現思路4. 代碼實現及詳細解釋4.1. RedisUtil4.2. Publisher4.3. Subscriber4.4. 運行程序 目錄: Redis簡介發布訂閱模式介紹實現思路代碼實現及詳細解釋 1. Redis簡…

HTB Napper WriteUp

Napper 2023年11月12日 14:58:35User Nmap ? Napper nmap -sCV -A -p- 10.10.11.240 --min-rate 10000 Starting Nmap 7.80 ( https://nmap.org ) at 2023-11-12 13:58 CST Nmap scan report for app.napper.htb (10.10.11.240) Host is up (0.15s latency). Not shown: …

gitee推薦-SAPI++

一下內容來自gitee。 SaaS-Apps-Engine: 智者|SAPI是多應用、多租戶SaaS應用引擎,支持(小程序/公眾號/輕應用/企微/抖音/支付寶/百度)等多平臺應用。基于ThinkPHP6.1/8.0原生多應用模式開發,簡潔、高效、易擴展。集成強大的權限控…

適用于電腦的5個免費文件恢復軟件分享

適用于電腦的最佳免費文件恢復軟件 任何計算機用戶都可能經歷過丟失重要文件的恐懼。重要數據的丟失可能會令人不安和沮喪,無論是由于不小心刪除、計算機故障還是硬盤格式化造成的。幸運的是,在數字時代,您可以使用值得信賴的解決方案檢索這些…

好工具|datamap,一個好用的地圖可視化Excel插件,在Excel中實現地理編碼、拾取坐標

在做VRP相關研究的時候,需要對地圖數據做很多處理,比如地理編碼,根據“重慶市沙坪壩區沙正街174號”這樣的一個文本地址知道他的經緯度;再比如繪制一些散點圖,根據某個位置的經緯度在地圖上把它標注出來。還有有的時候…

vue + docxtemplater 導出 word 文檔

一、痛點 word 導出 這種功能其實之前都是后端實現的,但最近有個項目沒得后端。所以研究下前端導出。 ps: 前端還可以導出 pdf,但是其分頁問題需要話精力去計算才可能實現,并且都不是很完善。可參考之前的文章:利用 h…

MIT6.824-Raft筆記:腦裂、Majority Vote(過半投票/過半選舉)

本部分主要是問題引入,以及給出一個解決方案 1 腦裂(Split Brain) replication system的共同點:單點 前面幾個容錯特性(fault-tolerant)的系統,有一個共同的特點。 MapReduce復制了計算&…

JavaScript框架 Angular、React、Vue.js 的全棧解決方案比較

在 Web 開發領域,JavaScript 提供大量技術棧可供選擇。其中最典型的三套組合,分別是 MERN、MEAN 和 MEVN。前端框架(React、Angular 和 Vue)進行簡化比較。 MERN 技術棧詳解 MERN 技術棧包含四大具體組件: MongoDB&am…

藍橋杯物聯網競賽_STM32L071_3_Oled顯示

地位: 對于任何一門編程語言的學習,print函數毫無疑問是一種最好的調試手段,調試者不僅能通過它獲取程序變量的運行狀態而且通過對其合理使用獲取程序的運行流程,更能通過關鍵變量的輸出幫你驗證推理的正確與否,樸素的…

常見網絡安全防護

1 阻斷服務攻擊(DOS) 阻斷服務攻擊,想辦法目標網絡資源用盡變種:分布式阻斷服務攻擊 影響: 寬帶消耗性(消耗目標的帶寬)資源消耗型(消耗目標的計算資源) 解決方案&am…

人工智能對網絡安全的影響越來越大

如果問當前IT行業最熱門的話題是什么,很少有人會回答除了人工智能(AI)之外的任何話題。 在不到 12 個月的時間里,人工智能已經從一項只有 IT 專業人員才能理解的技術發展成為從小學生到作家、程序員和藝術家的每個人都使用的工具…

MySQL索引事務基礎

目錄 1. 索引 1.1索引的概念 1.2索引的特點 1.3 索引的使用場景 1.4索引的使用 1.4.1查看索引 1.4.2創建索引 1.4.3刪除索引 1.5索引保存的數據結構 2.事務 2.1經典例子 2.2事務的概念 2.3事務的使用 2.4事務的4個核心特性 2.5事務的并發問題 2.5.1臟讀 2.5.2不可…

Python + Docker 還是 Rust + WebAssembly?

在不斷發展的技術世界中,由大語言模型驅動的應用程序,通常被稱為“LLM 應用”,已成為各種行業技術創新背后的驅動力。隨著這些應用程序的普及,用戶需求的大量涌入對底層基礎設施的性能、安全性和可靠性提出了新的挑戰。 Python 和…

Java項目如何打包成Jar(最簡單)

最簡單的辦法,使用Maven插件(idea自帶) 1.選擇需要打包的mudule,點擊idea右側的maven插件 2.clean操作 3.選擇需要的其他mudule,進行install操作(如果有) 4.再次選擇需要打包的module&#…

Vue.observable 是什么

Observable 翻譯過來我們可以理解成可觀察的 Vue.js2.6 新增 Vue.observable,讓一個對象變成響應式數據。Vue 內部會用它來處理 data 函數返回的對象 。 返回的對象可以直接用于渲染函數和計算屬性內,并且會在發生變更時觸發相應的更新。也可以作為最小化…