Java學習-------外觀模式

????????在軟件開發中,隨著系統的不斷迭代,模塊會越來越多,模塊之間的依賴關系也會變得錯綜復雜。這不僅會增加開發難度,還會讓系統的維護和擴展變得棘手。而外觀模式就像一位 “前臺接待員”,為復雜的系統提供一個簡潔統一的接口,讓外部與系統的交互變得簡單高效。。?

????????外觀模式是設計模式三大類中的一種結構型設計模式,它為子系統中的一組接口提供一個統一的高層接口,使得子系統更容易被使用。簡單來說,就是在復雜的子系統外面套上一個 “殼”,這個 “殼” 封裝了子系統內部的復雜邏輯和交互細節,外部只需與這個 “殼” 進行交互,無需關心子系統內部的具體實現。?例如,我們使用電腦時,只需按下開機鍵,電腦就會完成主板通電、CPU 啟動、內存加載系統等一系列復雜操作,而我們無需了解這些內部步驟,這里的 “開機鍵” 就相當于外觀模式中的統一接口。?

????????外觀模式的核心原理是封裝與委派。它通過引入一個外觀類(Facade),將子系統中各個模塊的接口進行整合和封裝。當外部客戶端需要調用子系統的功能時,不需要直接與子系統中的各個模塊交互,而是調用外觀類提供的接口,外觀類再將請求委派給子系統中相應的模塊進行處理。?其基本結構包含以下幾個部分:?

(1)外觀類:這是外觀模式的核心,它知道子系統中各個模塊的功能,為客戶端提供統一的接口,負責將客戶端的請求轉發給合適的子系統模塊。?

(2)子系統模塊:實現子系統的具體功能,它們不知道外觀類的存在,也不與外觀類進行交互,僅在接收到外觀類的委派請求時執行相應操作。?

(3)客戶端:通過外觀類與子系統進行交互,無需了解子系統內部的復雜結構。?

????????外觀模式在軟件開發中有著重要的作用,主要體現在以下幾個方面:?

(1)簡化接口調用:客戶端無需記住子系統中眾多模塊的接口,只需與外觀類的統一接口交互,大大降低了客戶端使用子系統的難度。?

(2)降低耦合度:外觀類將客戶端與子系統隔離開來,使得客戶端與子系統之間的依賴關系變為客戶端與外觀類之間的依賴,減少了系統的耦合度,便于后續的維護和擴展。?

(3)隱藏子系統細節:子系統內部的實現細節對客戶端是透明的,客戶端不需要知道子系統是如何工作的,只需關注外觀類提供的功能是否滿足需求。?

(4)便于子系統的管理:當子系統內部發生變化時,只要外觀類的接口保持不變,客戶端就不需要做任何修改,降低了因子系統變化對客戶端造成的影響。?

? ? ? ? 作為一種設計模式,外觀模式帶來了許多優點,例如:

(1)提高易用性:為復雜的子系統提供了簡單易用的接口,讓客戶端能夠快速上手使用子系統,減少了學習成本。?

(2)降低耦合度:將客戶端與子系統的直接交互轉變為與外觀類的交互,降低了兩者之間的耦合,符合 “迪米特法則”(最少知識原則)。?

(3)增強系統靈活性:子系統內部的模塊可以自由修改和擴展,只要不影響外觀類的接口,就不會對客戶端產生影響,提高了系統的靈活性。?

(4)便于維護:由于客戶端與子系統之間通過外觀類進行交互,當子系統出現問題時,只需排查外觀類與子系統之間的交互,縮小了問題排查的范圍,便于系統的維護。?

? ? ? ? 但同時,其也有各種各樣的缺點,如:

(1)引入冗余:如果客戶端需要使用子系統中一些較為特殊的功能,而外觀類沒有提供相應的接口,客戶端可能還是需要直接與子系統交互,這時候外觀模式就顯得有些冗余。?

(2)外觀類可能變得復雜:隨著子系統功能的不斷增加,外觀類需要整合的接口也會越來越多,可能會導致外觀類變得龐大而復雜,增加了外觀類的維護難度。?

(3)限制了客戶端的靈活性:外觀類提供的是統一的接口,可能無法滿足客戶端的個性化需求,客戶端不能像直接與子系統交互那樣靈活地使用子系統的功能。?

????????下面通過一個家庭影院的例子來演示外觀模式的實現。

????????一個家庭影院包含投影儀、音響、播放器等設備,要觀看電影需要依次開啟這些設備并進行相應設置,操作較為復雜。我們可以使用外觀模式,創建一個家庭影院外觀類來簡化這些操作。?

????????

// 子模塊類
// 投影儀
class Projector {public void on() {System.out.println("投影儀開啟");}public void off() {System.out.println("投影儀關閉");}public void setMode() {System.out.println("投影儀設置為電影模式");}
}// 音響
class SoundSystem {public void on() {System.out.println("音響開啟");}public void off() {System.out.println("音響關閉");}public void setVolume(int volume) {System.out.println("音響音量設置為:" + volume);}
}// 播放器
class Player {public void on() {System.out.println("播放器開啟");}public void off() {System.out.println("播放器關閉");}public void play() {System.out.println("播放器開始播放電影");}
}
// 外觀類
// 家庭影院
class HomeTheaterFacade {private Projector projector;private SoundSystem soundSystem;private Player player;public HomeTheaterFacade(Projector projector, SoundSystem soundSystem, Player player) {this.projector = projector;this.soundSystem = soundSystem;this.player = player;}// 觀看電影的統一接口public void watchMovie() {System.out.println("準備觀看電影...");projector.on();projector.setMode();soundSystem.on();soundSystem.setVolume(8);player.on();player.play();System.out.println("電影開始播放");}// 結束觀看電影的統一接口public void endMovie() {System.out.println("電影結束,關閉設備...");player.off();soundSystem.off();projector.off();System.out.println("所有設備已關閉");}
}
// 客戶端
public class Client {public static void main(String[] args) {// 創建子系統對象Projector projector = new Projector();SoundSystem soundSystem = new SoundSystem();Player player = new Player();// 創建外觀類對象HomeTheaterFacade homeTheater = new HomeTheaterFacade(projector, soundSystem, player);// 通過外觀類接口觀看電影homeTheater.watchMovie();// 電影結束,關閉設備homeTheater.endMovie();}
}

? ? ? ? 其運行結果大致為:

準備觀看電影...
投影儀開啟
投影儀設置為電影模式
音響開啟
音響音量設置為:8
播放器開啟
播放器開始播放電影
電影開始播放
電影結束,關閉設備...
播放器關閉
音響關閉
投影儀關閉
所有設備已關閉

????????從代碼和運行結果可以看出,客戶端只需調用家庭影院外觀類的watchMovie和endMovie方法,就可以完成觀看電影的一系列復雜操作,無需直接與投影儀、音響、播放器等子系統模塊交互,大大簡化了客戶端的操作。

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

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

相關文章

Go語言-->變量

Go語言–>變量 在 Go 語言中,定義變量有幾種常見的方式。下面是一些常見的語法和用法: 1. 使用 var 關鍵字定義變量 最常見的方式是使用 var 關鍵字,后面跟上變量名和類型。你也可以為變量賦初值。 基本格式: var variableName…

分布式鏈路追蹤的實現原理

分布式鏈路追蹤系統的實現涉及多個核心技術環節,下面我將從數據采集、上下文傳播、存儲分析等維度深入解析其工作原理。 一、核心架構組件 1. 系統組成模塊 #mermaid-svg-pDlZY54w2Z0Bp1H1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-si…

Python爬蟲實戰:研究micawber庫相關技術構建網頁采集系統

1. 引言 1.1 研究背景與意義 在當今信息爆炸的時代,互聯網上的數據量呈現出爆炸式增長。如何從海量的網頁數據中提取有價值的信息,成為了一個重要的研究課題。網絡爬蟲作為一種自動獲取網頁內容的技術,為解決這一問題提供了有效的手段。通過網絡爬蟲,可以快速、高效地采集…

前端框架Vue3(三)——路由和pinia

路由的理解 路由就是一組key-value的對應關系,多個路由,需要經過路由器的管理。 路由-基本切換效果 導航區、展示區請來路由器制定路由的具體規則(什么路徑,對應著什么組件)形成一個一個的路由 【兩個注意點】 路由組件…

【go】實現BMI計算小程序與GUI/WEB端實現

好的,下面是用 Go 語言實現的一個簡單的 BMI(Body Mass Index,身體質量指數)計算器,包含中文注釋與完整代碼,可以直接運行。 一、BMI 計算公式 BMI體重(kg)身高2(m2&…

Windows系統優化命令-記錄

閑著無聊,近來電腦有些卡頓,記錄一下相關命令。最好的命令還是格式化╮(╯▽╰)╭ 1. 磁盤清理相關命令 cleanmgr - 磁盤清理工具 cleanmgr啟動磁盤清理工具,可清理臨時文件、回收站等內容 diskpart - 磁盤分區工具 diskpart用于磁盤管理&…

BFCP協議學習

BFCP是為了SIP呼叫中實現presentation的二進制協議。開源庫libbfcp 如何協商角色 SIP 消息的SDP中有BFCP 的部分,其中s-only 代表要當服務器角色,c-only 代表要當client角色。confid, userid 都是需要在后續消息中對齊的。 通過port信息可以為后續bfcp…

常用設計模式系列(十七)—命令模式

常用設計模式系列(十七)—命令模式 第一節、前言 各位老鐵好! 今天我來跟大家分享對象行為型模式第二章節——《命令模式》,“命令”一詞,通俗易懂,我們在生活中經常會發出各種各樣的命令,就像你…

【AI繪畫】Stable Diffusion 全面指南:安裝、版本對比、功能解析與高級應用

引言:Stable Diffusion 概述 在人工智能圖像生成領域,商業工具如Midjourney憑借其集成化服務與高質量輸出占據市場,而Stable Diffusion(簡稱SD)則以開源特性構建了差異化優勢。與商業工具依賴云端資源、受限于訂閱費用…

kafka使用kraft

window 使用kafka-storage生成生成一個uuid .\kafka-storage.bat random-uuid格式化存儲 在這里插入代碼片.\kafka-storage.bat format -t 對應的uuid D:\configure\fisher\kafka\config\kraft\server.properties 啟動命令 .\kafka-server-start.bat D:\configure\fisher\kafka…

HCIA-Datacom認證筆記:IP路由基礎——核心概念與路由分類

網絡技術學習中,IP路由是繞不開的核心知識點,對于備考HCIA-Datacom認證的朋友來說,掌握路由基礎能為后續學習打下良好基礎。今天帶朋友們梳理一下IP路由的核心概念、路由表結構及路由分類一、路由核心概念什么是路由? 簡單來說&am…

FFmpeg 安裝與使用

文章目錄1. 環境部署(Windows)1.1. 安裝包下載1.2. 配置環境變量1.3. 驗證安裝2. FFmpeg 基礎使用教程2.1. 常用命令格式2.2. 基礎功能示例2.2.1. 視頻轉碼(MP4 → MKV)2.2.2. 調整分辨率(1080p → 480p)2.…

Python 數據分析(四):Pandas 進階

目錄 1. 概述2. 缺失項3. 分組聚合4. 數據合并5. 數據可視化 5.1 折線圖5.2 條形圖5.3 直方圖5.4 散點圖5.5 餅圖 1. 概述 我們在上一篇文章初識 Pandas中已經對 Pandas 作了一些基本介紹,本文我們進一步來學習 Pandas 的一些使用。 2. 缺失項 在現實中我們獲…

結構化文本文檔的內容抽取與版本重構策略

結構化文本文檔的內容抽取與版本重構策略 摘要 本文深入探討了結構化文本文檔處理領域中的兩大核心技術——內容抽取與版本重構。文章首先分析了結構化文檔的特點及其在現代信息管理中的重要性,隨后系統性地介紹了文檔內容抽取的技術路線與方法論,包括…

【BUUCTF系列】[HCTF 2018]WarmUp1

本文僅用于技術研究,禁止用于非法用途。 Author:枷鎖 點開題目顯示一個圖片,沒有任何交互功能,我們直接查看網頁源代碼我們可以看到有一個歆慕的注釋source.php,我們進行拼接,訪問一下這個文件在url后加上/source.php進…

Flutter Chen Generator - IconFont Generator

Flutter Chen Generator 🚀 一個強大的Flutter代碼生成工具包,包含多個實用的代碼生成器。 ? 功能特性 📁 資源生成器 (Assets Generator) 🔄 自動掃描assets目錄并生成Dart常量🧠 智能駝峰命名轉換,保…

【MATLAB】(二)基礎知識

一.MATLAB命令1.指令行“頭首”的 “>>” 是 “指令輸入提示符” ,它是自動輸入的。“>>” 為運算提示符,表示MATLAB處于準備就緒狀態。如在提示符后輸入一條命令或一段程序后按Enter鍵,MATLAB將給出對應的結果,并將結…

Day36| 1049. 最后一塊石頭的重量 II、494.目標和、474.一和零

文章鏈接 1049. 最后一塊石頭的重量 II 解題關鍵:找到重量和盡量相等的兩堆 確定dp數組以及下標的含義 dp[j]表示容量(這里說容量更形象,其實就是重量)為j的背包,最多可以背最大重量為dp[j]。 確定遞推公式 01背包…

【A*/BFS】P5507 機關

# P5507 機關 題目描述 這扇門上有一個機關,上面一共有12個旋鈕,每個旋鈕有4個狀態,將旋鈕的狀態用數字111到444表示 每個旋鈕只能向一個方向旋轉(狀態:1->2->3->4->1),在旋轉時&am…

終結集成亂局:模型上下文協議(MCP)如何重構AI工具生態?

AI 助手正處于能力發展的初級階段。它們擅長處理獨立任務——例如解析 PDF、編寫 SQL 語句、等等——但當你要求它們在 Slack、Gmail 和 Jira 等平臺間協同操作時,整個流程就變得異常復雜且脆弱,如同調試一套由眾多 API 密鑰串聯的精密機械(魯…