【設計模式】JAVA Design Patterns——Facade(外觀模式)

🔍目的


為一個子系統中的一系列接口提供一個統一的接口。外觀定義了一個更高級別的接口以便子系統更容易使用。

🔍解釋


真實世界例子

一個金礦是怎么工作的?“嗯,礦工下去然后挖金子!”你說。這是你所相信的因為你在使用一個金礦對外提供的一個簡單接口,在內部它要卻要做很多事情。這個簡單的接口對復雜的子系統來說就是一個外觀。

通俗描述

外觀模式為一個復雜的子系統提供一個簡單的接口。

維基百科

外觀是為很大體量的代碼(比如類庫)提供簡單接口的一種對象。

程序示例

使用上面金礦的例子。這里我們有矮人的礦工等級制度。


@Slf4j
public abstract class DwarvenMineWorker {public void goToSleep() {LOGGER.info("{} goes to sleep.", name());}public void wakeUp() {LOGGER.info("{} wakes up.", name());}public void goHome() {LOGGER.info("{} goes home.", name());}public void goToMine() {LOGGER.info("{} goes to the mine.", name());}private void action(Action action) {switch (action) {case GO_TO_SLEEP -> goToSleep();case WAKE_UP -> wakeUp();case GO_HOME -> goHome();case GO_TO_MINE -> goToMine();case WORK -> work();default -> LOGGER.info("Undefined action");}}public void action(Action... actions) {Arrays.stream(actions).forEach(this::action);}public abstract void work();public abstract String name();enum Action {GO_TO_SLEEP, WAKE_UP, GO_HOME, GO_TO_MINE, WORK}
}@Slf4j
public class DwarvenTunnelDigger extends DwarvenMineWorker {@Overridepublic void work() {LOGGER.info("{} creates another promising tunnel.", name());}@Overridepublic String name() {return "Dwarven tunnel digger";}
}@Slf4j
public class DwarvenGoldDigger extends DwarvenMineWorker {@Overridepublic void work() {LOGGER.info("{} digs for gold.", name());}@Overridepublic String name() {return "Dwarf gold digger";}
}@Slf4j
public class DwarvenCartOperator extends DwarvenMineWorker {@Overridepublic void work() {LOGGER.info("{} moves gold chunks out of the mine.", name());}@Overridepublic String name() {return "Dwarf cart operator";}
}

創建外觀類來進行操縱這些礦工:

public class DwarvenGoldmineFacade {private final List<DwarvenMineWorker> workers;public DwarvenGoldmineFacade() {workers = List.of(new DwarvenGoldDigger(),new DwarvenCartOperator(),new DwarvenTunnelDigger());}public void startNewDay() {makeActions(workers, DwarvenMineWorker.Action.WAKE_UP, DwarvenMineWorker.Action.GO_TO_MINE);}public void digOutGold() {makeActions(workers, DwarvenMineWorker.Action.WORK);}public void endDay() {makeActions(workers, DwarvenMineWorker.Action.GO_HOME, DwarvenMineWorker.Action.GO_TO_SLEEP);}private static void makeActions(Collection<DwarvenMineWorker> workers,DwarvenMineWorker.Action... actions) {workers.forEach(worker -> worker.action(actions));}
}

使用外觀:

DwarvenGoldmineFacade facade = new DwarvenGoldmineFacade();
facade.startNewDay();
// Dwarf gold digger wakes up.
// Dwarf gold digger goes to the mine.
// Dwarf cart operator wakes up.
// Dwarf cart operator goes to the mine.
// Dwarven tunnel digger wakes up.
// Dwarven tunnel digger goes to the mine.
facade.digOutGold();
// Dwarf gold digger digs for gold.
// Dwarf cart operator moves gold chunks out of the mine.
// Dwarven tunnel digger creates another promising tunnel.
facade.endDay();
// Dwarf gold digger goes home.
// Dwarf gold digger goes to sleep.
// Dwarf cart operator goes home.
// Dwarf cart operator goes to sleep.
// Dwarven tunnel digger goes home.
// Dwarven tunnel digger goes to sleep.

🔍類圖


🔍適用性


使用外觀模式

  • 你想為一個復雜的子系統提供一個簡單的接口。隨著子系統的發展,它們通常會變得更加復雜。多數模式在應用時會導致更多和更少的類。這使子系統更可重用,更易于自定義,但是對于不需要自定義它的客戶來說,使用它也變得更加困難。 外觀可以提供子系統的簡單默認視圖,足以滿足大多數客戶端的需求。只有需要更多可定制性的客戶才需要查看外觀外的東西(原子系統提供的接口)。
  • 客戶端與抽象的實現類之間存在許多依賴關系。 引入外觀以使子系統與客戶端和其他子系統分離,從而提高子系統的獨立性和可移植性。
  • 您想對子系統進行分層。 使用外觀來定義每個子系統級別的入口點。 如果子系統是相關的,則可以通過使子系統僅通過其外觀相互通信來簡化它們之間的依賴性。

🔍Ending

Facade模式通常涉及一個名為Facade的單一類,該類提供了一個高級接口,用于與客戶端交互,并將客戶端的請求委派給系統內部的一組相關對象。這樣,客戶端就不需要直接與系統內部的各個組件進行交互,而是通過Facade來簡化交互過程。?


希望本文能夠幫助讀者更深入地理解外觀模式,并在實際項目中發揮其優勢。謝謝閱讀!


希望這份博客草稿能夠幫助到你。如果有其他需要修改或添加的地方,請隨時告訴我。

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

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

相關文章

性價比為王,物流商怎么選擇高效的國際物流管理平臺

在全球化貿易日益繁榮的今天&#xff0c;國際物流行業作為鏈接國內商家和海外市場的重要橋梁&#xff0c;發揮著極其重要的作用。 然而&#xff0c;隨著國際物流市場競爭的加劇&#xff0c;對物流商來說&#xff0c;也面臨著成本管控和效率提升的雙重挑戰。今天我們會重點探討…

解決 DataGrip 2024.1.3 連接 Tdengine 時timestamp字段顯示時區不正確問題

設置中找到該設置&#xff0c;將原來的設置 yyyy-MM-dd HH:mm:ss 修改為: yyyy-MM-dd HH:mm:ss.SSS z 即可。 注意&#xff1a;只能修改第一個,修改后提示錯誤&#xff0c;但是查詢數據時能成功格式化時間&#xff0c;修改第二個不生效&#xff0c;可能是 bug 具體格式見: Date…

DOS編程入門:探索基礎、深入技巧與實戰應用

DOS編程入門&#xff1a;探索基礎、深入技巧與實戰應用 DOS編程&#xff0c;作為計算機編程的基石之一&#xff0c;對于初學者來說&#xff0c;既是一種挑戰&#xff0c;也是一次深入了解計算機底層運作的絕佳機會。本文將從四個方面、五個方面、六個方面和七個方面&#xff0…

Opera 瀏覽器與Google聯手,推出由Gemini驅動的全新AI功能

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

JavaScript循環語句

JavaScript中的循環語句有三種&#xff1a;for循環、while循環和do...while循環。這些循環語句可以幫助我們重復執行一段代碼&#xff0c;直到滿足某個條件為止。 for循環&#xff1a; for循環是最常用的循環語句之一&#xff0c;它包含一個初始化表達式、一個條件表達式和一個…

富士攝像機X-H2S MOV格式化后重新寫入后的恢復方法

X-H2S是富士數碼的一款旗艦機型&#xff0c;支持4K/6K高清&#xff0c;視頻編碼為最新的HVC。下面我們來看下富士數碼攝像機恢復案例。 故障存儲:512G存儲卡 Exfat文件系統 故障現象: 512G的卡誤格式化后又進行了拍攝&#xff0c;卡使用了120G不到的空間&#xff0c;其它底…

【副業】12種程序員副業大匯總

1&#xff1a;寫博客。技術能力可以的寫技術文章輸出&#xff0c;比如當前網站、掘金、阿里云社區、騰訊云社區、其他社區。 2&#xff1a;賣課程。大廠高P跟知識付費平臺合作、錄課賣課程、比如極課時間、慕課網、騰訊課堂。 3&#xff1a;寫書。技術大拿出書&#xff0c;掙稿…

簡述Vue中同時發送多個請求怎么操作?

在Vue中同時發送多個請求&#xff0c;我們通常使用axios這個庫&#xff0c;因為它基于Promise&#xff0c;可以很好地處理異步操作。以下是兩種常用的方法來同時發送多個請求&#xff1a; 方法一&#xff1a;使用Promise.all() 定義多個請求&#xff1a; 使用axios.get()或axi…

【EFK日志系統】docker一鍵部署kibana、es-head

docker一鍵部署kibana、es-head kibana部署es-head部署 上一篇文章搭建了es集群 規劃服務器是 es01:172.23.165.185 es02:172.23.165.186 es03:172.23.165.187 那么kibana就搭建在主節點es01:172.23.165.185 按照順序參考&#xff1a; docker一鍵部署EFK系統&#xff08;elas…

使用 Vue 3 和 JsBarcode 開發一維碼顯示組件

在現代前端開發中&#xff0c;條形碼&#xff08;或稱一維碼&#xff09;在許多應用場景中非常常見&#xff0c;例如商品管理、物流跟蹤等。本文將介紹如何使用 Vue 3 和 JsBarcode 庫來創建一個靈活的一維碼顯示組件&#xff0c;并展示如何在應用中使用它。 1. 安裝必要的依賴…

簡述Vue 的響應式原理中 Object.defineProperty 有什 么缺陷 ?

Vue.js 2.x 的響應式原理主要依賴于 Object.defineProperty 方法來實現數據劫持&#xff0c;即當數據發生變化時&#xff0c;能夠觸發視圖更新。然而&#xff0c;Object.defineProperty 方法在 Vue 的響應式系統中存在一些缺陷&#xff1a; 無法監聽數組的變化&#xff1a; Obj…

詳解生成式人工智能的開發過程

回到機器學習的“古老”時代&#xff0c;在您可以使用大型語言模型&#xff08;LLM&#xff09;作為調優模型的基礎之前&#xff0c;您基本上必須在所有數據上訓練每個可能的機器學習模型&#xff0c;以找到最佳&#xff08;或最不糟糕&#xff09;的擬合。 開發生成式人工智能…

【linux】線程同步和生產消費者模型

線程同步 當我們多線程訪問同一個臨界資源時&#xff0c;會造成并發訪問一個臨界資源&#xff0c;使得臨界資源數據不安全&#xff0c;我們引入了鎖的概念&#xff0c;解決了臨界資源訪問不安全的情況&#xff0c;對于線程而言競爭鎖的能力有強有弱&#xff0c;對于之前就搶到…

系統架構設計師【第9章】: 軟件可靠性基礎知識 (核心總結)

文章目錄 9.1 軟件可靠性基本概念9.1.1 軟件可靠性定義9.1.2 軟件可靠性的定量描述9.1.3 可靠性目標9.1.4 可靠性測試的意義9.1.5 廣義的可靠性測試與狹義的可靠性測試 9.2 軟件可靠性建模9.2.1 影響軟件可靠性的因素9.2.2 軟件可靠性的建模方法9.2.3 軟件的可靠性模…

實物資產的市場主線將逐步回歸

民生證券認為&#xff0c;投資者逐漸意識到長期趨勢并沒有發生變化&#xff0c;這或許正是本周最大的變化。在預期博弈重回冷靜期后&#xff0c;去金融化背景下實物資源占優的市場主線也將逐步回歸。 1 高低切換后的冷靜期 從4月下旬至上周&#xff0c;A股市場呈現出由高位資產…

用windows server backup備份文件夾到網絡共享文件夾并恢復

一、備份 開始 運行windows server backup,在右邊的窗格中點擊“備份計劃” 選擇備份配置 因為我們要備份的是一個文件夾&#xff0c;所以&#xff0c;選“自定義”&#xff0c;卷即為磁盤分區。 選擇要備份的項 點擊添加項目&#xff0c;可依次添加多個備份項目。 勾選需要…

汽車MCU虛擬化--對中斷虛擬化的思考(2)

目錄 1.引入 2.TC4xx如何實現中斷虛擬化 3.小結 1.引入 其實不管內核怎么變&#xff0c;針對中斷虛擬化無非就是上面兩種&#xff0c;要么透傳給VM&#xff0c;要么由Hypervisor統一分發。汽車MCU虛擬化--對中斷虛擬化的思考(1)-CSDN博客 那么&#xff0c;作為車規MCU龍頭…

MySQL 視圖(2)

上一篇&#xff1a;MySQL視圖&#xff08;1&#xff09; 基于其他視圖 案例對 WITH [CASCADED | LOCAL] CHECK OPTION 進行釋義 創建視圖時&#xff0c;可以基于表 / 多個表&#xff0c;也可以使用 其他視圖表 / 其他視圖 其他視圖 的方式進行組合。 總結 更新視圖&#x…

【HTML】tabindex

當給 div 標簽以 button 角色&#xff1a; <div role"button">這時要指定其 tabindex&#xff0c;因此正確的寫法是&#xff1a; <div role"button" tabindex"0">索引值不應當大于0&#xff0c;見a11y-positive-tabindex

Open3D(C++) Ransac擬合多項式曲線

目錄 一、算法原理一、代碼實現三、結果展示本文由CSDN點云俠原創,Open3D(C++) Ransac擬合多項式曲線,爬蟲自重。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲與GPT生成的文章。 一、算法原理 RANSAC(Random Sample Consensus)是一種用于擬合模型的迭…