設計模式淺析(八) ·外觀模式

設計模式淺析(八) ·外觀模式

日常叨逼叨

java設計模式淺析,如果覺得對你有幫助,記得一鍵三連,謝謝各位觀眾老爺😁😁


外觀模式

概念

外觀模式(Facade Pattern)是一種設計模式,它為子系統中的一組接口提供一個統一的高層接口,使得子系統更加容易使用。這種設計模式的主要目的是降低系統的復雜性,簡化客戶端與子系統之間的交互。

外觀(Facade)模式是“迪米特法則”的典型應用。

迪米特法則:又叫作最少知識原則(The Least Knowledge Principle),一個類對于其他類知道的越少越好,就是說一個對象應當對其他對象有盡可能少的了解,只和朋友通信,不和陌生人說話。英文簡寫為: LOD。

組成
  1. 外觀類(Facade):這是外觀模式的核心。外觀類為客戶端提供了一個簡潔的接口,用于訪問子系統中的功能。外觀類內部通常包含了對子系統多個組件的引用,并且提供了高層次的方法來調用這些組件。客戶端不需要直接與子系統組件交互,而是通過外觀類來間接訪問它們。
  2. 子系統組件(Subsystem Components):這些是子系統中實際執行操作的類。它們實現了具體的功能,但通常對于客戶端來說是不可見的。外觀類負責協調這些組件的工作,并將結果呈現給客戶端。
  3. 客戶端(Client):客戶端是使用外觀模式的代碼部分。它只需要與外觀類交互,而不需要了解子系統的具體實現細節。客戶端通過調用外觀類提供的方法,可以間接地使用子系統提供的功能。

案例

我就以自己家里的一些家電為例子,比如我家有電燈,空調,電視這三種家電,然后呢他們都有自己獨立的開關,我如果我想要讓它們都處于工作狀態,我得一件一件地去打開他們的開關,但是呢,我個人比較懶,想著能不能接入一個小雷同學,讓它去負責各個家電,我只需要操作小雷同學就可以?

說干就干,首先是我家里的各個電器

//空調
public class AirCondition {public void on() {System.out.println("打開了空調....");}public void off() {System.out.println("關閉了空調....");}
}
//電視機
public class TV {public void on() {System.out.println("打開了電視....");}public void off() {System.out.println("關閉了電視....");}
}
//燈
public class Light {public void on() {System.out.println("打開了燈....");}public void off() {System.out.println("關閉了燈....");}
}

然后呢,我接入一個小雷同學

//智能音箱
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;//other household appliancepublic SmartAppliancesFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}public void say(String message) {if (message.contains("開燈")) {onLamp();} else if (message.contains("關燈")) {offLamp();} else if (message.contains("開電視")) {onTV();} else if (message.contains("關電視")) {offTV();} else if (message.contains("開空調")) {onAirCondition();} else if (message.contains("關空調")) {offAirCondition();} else if (message.contains("打開家電")) {onLamp();onTV();onAirCondition();//on other household appliance} else if (message.contains("關閉家電")) {offLamp();offTV();offAirCondition();//off other household appliance} else {System.out.println("我還聽不懂你說的!!!");}}private void onLamp() {light.on();}private void offLamp() {light.off();}private void onTV() {tv.on();}private void offTV() {tv.off();}private void onAirCondition() {airCondition.on();}private void offAirCondition() {airCondition.off();}
}

而對于我來說,我只需要知道小雷同學,而不需要知道各個家電。

public class Client {public static void main(String[] args) {//創建外觀對象SmartAppliancesFacade facade = new SmartAppliancesFacade();//客戶端直接與外觀對象進行交互facade.say("小雷同學,請打開家電");
//        facade.say("關閉家電");}
}

執行結果:

打開了燈…
打開了電視…
打開了空調…

這樣,對于客戶端來說,可以通過一個智能音箱控制全部,而不用管其他的具體實現,只要知道這個接口即可以了。

但是在一些具體的示例中,外觀模式的使用可能有所差異,望各位看官老爺們斟酌使用。

優缺點

外觀模式的主要優點包括:

  • 簡化了客戶端的使用:客戶端只需要與外觀類交互,而不需要了解子系統的復雜性。
  • 降低了系統的耦合度:外觀類將客戶端與子系統解耦,減少了它們之間的直接依賴。
  • 提供了統一的接口:外觀類為子系統提供了一個統一的接口,使得子系統更加容易集成和擴展。

然而,外觀模式也有一些潛在的缺點,比如:

  • 過度集中化:如果外觀類承擔了太多的責任,它可能會變得過于復雜和難以維護。
  • 不適合所有場景:對于某些系統來說,外觀模式可能并不是最合適的設計選擇。如果子系統非常簡單,或者客戶端需要直接訪問子系統組件,那么外觀模式可能并不適用。

代碼相關代碼可以參考 代碼倉庫🌐

ps:本文原創,轉載請注明出處


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

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

相關文章

深度學習發展里程碑事件2006-2024

2006-2024年,深度學習發展經歷眾多的里程碑事件,一次次地刺激著人們的神經,帶來巨大的興奮。電影還在繼續,好戲在后面,期待…… 2006年 深度信念網絡(DBNs):Geoffrey Hinton與他的學…

備戰藍橋杯 Day10(背包dp)

01背包問題 1267:【例9.11】01背包問題 【題目描述】 一個旅行者有一個最多能裝 M� 公斤的背包,現在有 n� 件物品,它們的重量分別是W1,W2,...,Wn�1,�2&#…

藍橋杯刷題--python-10(2023填空題3)

0工作時長 - 藍橋云課 (lanqiao.cn) import datetime time_str_list=[] while(True):tmp=input()if not tmp: breaktime_str_list.append(tmp)# time_list=[datetime.datetime.strptime(t,"%Y-%m-%d %H:%M:%S")for t in time_str_list] time_list.sort() sum=0 for i…

【代碼隨想錄算法訓練營Day25】● 216.組合總和III ● 17.電話號碼的字母組合

文章目錄 Day 25 第七章 回溯算法part02216.組合總和III自己的思路(?通過) 17.電話號碼的字母組合思路代碼 Day 25 第七章 回溯算法part02 今日內容: ● 216.組合總和III● 17.電話號碼的字母組合 216.組合總和III 如果把 組合問題理解了…

計算機組成原理(9)----硬布線控制器

控制單元CU若想發出對應的控制信號,則需要以下信息:指令操作碼,目前的機器周期,節拍信號,機器狀態條件,根據這些信息,CU就能確定在這個節拍下應該發出哪些"微命令",也就是…

SQL注入:使用預編譯防御SQL注入時產生的問題

目錄 前言 模擬預編譯 真正的預編譯 預編譯中存在的SQL注入 寬字節 沒有進行參數綁定 無法預編譯的位置 前言 相信學習過SQL注入的小伙伴都知道防御SQL注入最好的方法,就是使用預編譯也就是PDO是可以非常好的防御SQL注入的,但是如果錯誤的設置了…

計算機設計大賽 深度學習動物識別 - 卷積神經網絡 機器視覺 圖像識別

文章目錄 0 前言1 背景2 算法原理2.1 動物識別方法概況2.2 常用的網絡模型2.2.1 B-CNN2.2.2 SSD 3 SSD動物目標檢測流程4 實現效果5 部分相關代碼5.1 數據預處理5.2 構建卷積神經網絡5.3 tensorflow計算圖可視化5.4 網絡模型訓練5.5 對貓狗圖像進行2分類 6 最后 0 前言 &#…

從零學算法238

238.給你一個整數數組 nums,返回 數組 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘積 。 題目數據 保證 數組 nums之中任意元素的全部前綴元素和后綴的乘積都在 32 位 整數范圍內。 請 不要使用除法,且在 O(n) 時間復…

Python自動化UI測試之Selenium基礎實操

1. Selenium簡介 Selenium 是一個用于 Web 應用程序測試的工具。最初是為網站自動化測試而開發的,可以直接運行在瀏覽器上,支持的瀏覽器包括 IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Googl…

SVN忽略已提交的文件(ignore,移出版本控制)

本文適用于已安裝TortoiseSVN客戶端的同學。 1、右鍵點擊要忽略的文件夾或文件,鼠標移到“TortoiseSVN”,找到“Unversion and add to ignore list”,選擇文件夾,彈出提示框確認忽略。 2、設置完忽略文件后,還需要做…

多維時序 | Matlab實現GRU-MATT門控循環單元融合多頭注意力多變量時間序列預測模型

多維時序 | Matlab實現GRU-MATT門控循環單元融合多頭注意力多變量時間序列預測模型 目錄 多維時序 | Matlab實現GRU-MATT門控循環單元融合多頭注意力多變量時間序列預測模型預測效果基本介紹程序設計參考資料 預測效果 基本介紹 1.多維時序 | Matlab實現GRU-MATT門控循環單元融…

【Maven】介紹、下載及安裝、集成IDEA

目錄 一、什么是Maven Maven的作用 Maven模型 Maven倉庫 二、下載及安裝 三、IDEA集成Maven 1、POM配置詳解 2、配置Maven環境 局部配置 全局設置 四、創建Maven項目 五、Maven坐標詳解 六、導入Maven項目 方式1:使用Maven面板,快速導入項目 …

React Native框架開發介紹,以及其優點

大家好,我是咕嚕鐵蛋,在今天的文章中,我通過科技手段和大家一起探討一下React Native框架的開發介紹以及其優點。我深知選擇合適的開發工具對于項目的成功至關重要。而React Native作為一款流行的跨平臺移動應用開發框架,其獨特之…

Linux并發與競爭的基本概念

一. 簡介 Linux是一個多任務操作系統,肯定會存在多個任務共同操作同一段內存或者設備的情況, 多個任務甚至中斷都能訪問的資源叫做共享資源,在驅動開發中要注意對共享資源的保護,也就是要處理對共享資源的并發訪問。比如&#xf…

【服務器數據恢復】FreeNAS+ESXi虛擬機數據恢復案例

服務器數據恢復環境: 一臺服務器通過FreeNAS(本案例使用的是UFS2文件系統)實現iSCSI存儲,整個UFS2文件系統作為一個文件掛載到ESXi虛擬化系統(安裝在另外2臺服務器上)上。該虛擬化系統一共有5臺虛擬機&…

2024水科技大會暨技術裝備成果展覽會——高品質供水和飲用水水源安全保障論壇

供水與飲水安全直接關系到人民群眾的生活與健康,切實做好城市供水與飲水安全保障工作,是把以人為本真正落到實處的一項緊迫任務。近年來,中央和地方加大了城鄉供水與飲水安全保障工作的力度,對標最優質供水城市建設要求&#xff0…

[Angular 基礎] - service 服務

[Angular 基礎] - service 服務 之前的筆記就列舉三個好了……沒想到 Angular 東西這么多(ー ー;)……全加感覺越來越湊字數了 [Angular 基礎] - 視圖封裝 & 局部引用 & 父子組件中內容傳遞 [Angular 基礎] - 生命周期函數 [Angular 基礎] - 自…

請簡述你對SpringMVC的理解

SpringMVC是一種基于Java語言開發,實現了WebMVC設計模式,請求驅動類型 的輕量級Web框架。 采用了MVC架構模式的思想,通過把Model,View,Controller分離,將Web層進 行職責解耦,從而把復雜的Web應…

idea打開項目白屏

解決方法: 右鍵“最大化” idea打開項目白板解決方案_idea打開白屏-CSDN博客 IDEA 2022 CPU占用100%的問題及解決方法_java_腳本之家

STM32控制數碼管從0顯示到99

首先 先畫電路圖吧!打開proteus,導入相關器件,繪制電路圖。如下:(記得要保存啊!發現模擬一遍程序就自動退出了,有bug,我是解決不了,所以就是要及時保存,自己重…