Java 設計模式系列:外觀模式

簡介

外觀模式(Facade Pattern)是一種設計模式,又名門面模式,是一種通過為多個復雜的子系統提供一個一致的接口,而使這些子系統更加容易被訪問的模式。該模式對外有一個統一接口,外部應用程序不用關心內部子系統的具體的細節,這樣會大大降低應用程序的復雜度,提高了程序的可維護性。

外觀模式的關鍵在于隱藏系統的復雜性,并簡化客戶端與系統之間的交互。它通過提供一個統一的接口,使得客戶端無需了解系統內部的復雜聯系和實現細節,只需要通過外觀類與系統進行交互即可。這有助于降低系統的耦合度,提高系統的可維護性和可擴展性。

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

在這里插入圖片描述

結構

  • 外觀(Facade)模式包含以下主要角色:

    • 外觀(Facade)角色:為多個子系統對外提供一個共同的接口。
    • 子系統(Sub System)角色:實現系統的部分功能,客戶可以通過外觀角色訪問它。

案例實現

【例】智能家電控制

小明的爺爺已經60歲了,一個人在家生活:每次都需要打開燈、打開電視、打開空調;睡覺時關閉燈、關閉電視、關閉空調;操作起來都比較麻煩。所以小明給爺爺買了智能音箱,可以通過語音直接控制這些智能家電的開啟和關閉。類圖如下:

代碼如下:

//燈類
public class Light {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 AirCondition {public void on() {System.out.println("打開了空調....");}public void off() {System.out.println("關閉了空調....");}
}//智能音箱
public class SmartAppliancesFacade {private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}public void say(String message) {if(message.contains("打開")) {on();} else if(message.contains("關閉")) {off();} else {System.out.println("我還聽不懂你說的!!!");}}//起床后一鍵開電器private void on() {System.out.println("起床了");light.on();tv.on();airCondition.on();}//睡覺一鍵關電器private void off() {System.out.println("睡覺了");light.off();tv.off();airCondition.off();}
}//測試類
public class Client {public static void main(String[] args) {//創建外觀對象SmartAppliancesFacade facade = new SmartAppliancesFacade();//客戶端直接與外觀對象進行交互facade.say("打開家電");facade.say("關閉家電");}
}

優缺點

外觀模式的優點包括:

  1. 降低系統耦合度:通過提供一個統一的接口,將客戶端與系統的具體實現細節解耦,使得系統更加靈活和可維護。
  2. 提高安全性:通過限制對子系統的直接訪問,可以預防低水平人員帶來的風險,保護系統的安全。
  3. 提高可擴展性:通過將復雜的子系統隱藏在外觀類后面,可以更容易地添加新的子系統和功能,提高系統的可擴展性。

然而,外觀模式也存在一些缺點:

  1. 不符合開閉原則:如果要修改子系統中的某些方法,可能需要修改外觀類,這可能會違反開閉原則。
  2. 增加了系統的層次:使用外觀模式會增加系統的層次,這可能會影響系統的性能和可讀性。

使用場景

  • 對分層結構系統構建時,使用外觀模式定義子系統中每層的入口點可以簡化子系統之間的依賴關系。
  • 當一個復雜系統的子系統很多時,外觀模式可以為系統設計一個簡單的接口供外界訪問。
  • 當客戶端與多個子系統之間存在很大的聯系時,引入外觀模式可將它們分離,從而提高子系統的獨立性和可移植性。

源碼中的應用

Tomcat

RequestFacade

使用tomcat作為web容器時,接收瀏覽器發送過來的請求,tomcat會將請求信息封裝成ServletRequest對象,如下圖①處對象。但是大家想想ServletRequest是一個接口,它還有一個子接口HttpServletRequest,而我們知道該request對象肯定是一個HttpServletRequest對象的子實現類對象,到底是哪個類的對象呢?可以通過輸出request對象,我們就會發現是一個名為RequestFacade的類的對象。

RequestFacade類就使用了外觀模式。先看結構圖:

為什么在此處使用外觀模式呢?

? 定義 RequestFacade 類,分別實現 ServletRequest ,同時定義私有成員變量 Request ,并且方法的實現調用 Request 的實現。然后,將 RequestFacade上轉為 ServletRequest 傳給 servlet 的 service 方法,這樣即使在 servlet 中被下轉為 RequestFacade ,也不能訪問私有成員變量對象中的方法。既用了 Request ,又能防止其中方法被不合理的訪問。

Spring

ApplicationContext

ApplicationContext是Spring框架中的一個核心接口,它提供了配置信息以及訪問定義好的bean的功能。ApplicationContext可以看作是Spring容器的一個外觀類,它封裝了底層BeanFactory的復雜性,為開發者提供了一個更加高級和易于使用的接口。通過ApplicationContext,開發者可以輕松地獲取bean的實例,而無需直接與底層的BeanFactory進行交互。

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

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

相關文章

Android中RecyclerView使用詳解(一)

目錄 概述優點列表布局RecyclerView一、創建RecyclerView并且在布局中綁定二、實現RecyclerView單個item的布局三、給RecyclerView寫一個對應的適配器Adapter1.創建自定義的ViewHolder2.繼承Adapter,泛型使用我們自定義的ViewHolder3.重寫Adapter的三個方法onCreate…

線程安全(二)synchronized 的底層實現原理、鎖升級、對象的內存結構

目錄 一、基礎使用1.1 不加鎖的代碼實現1.2 加鎖的代碼實現二、實現原理2.1 synchronized 簡介2.2 對象監控器(Monitor)2.3 加鎖過程第一步:判斷 Owner 指向第二步:進入 EntryList 阻塞第三步:主動進入 WaitSet 等待三、鎖升級3.1 對象的內存結構3.2 Mark Word 對象頭3.3 …

MySQL sql_safe_updates參數

sql_safe_updates 是 MySQL 中的一個系統變量,用于控制 MySQL 服務器是否允許在沒有使用 KEY 或 LIMIT 子句的 UPDATE 或 DELETE 語句上執行更新或刪除操作。當這個變量被設置為 ON 時,MySQL 會拒絕那些可能影響到表中大量行的 UPDATE 或 DELETE 語句&am…

SpringBoot實戰:多表聯查

1. 保存和更新公寓信息 請求數據的結構 Schema(description "公寓信息") Data public class ApartmentSubmitVo extends ApartmentInfo {Schema(description"公寓配套id")private List<Long> facilityInfoIds;Schema(description"公寓標簽i…

LLM用于時序預測真的不行,連推理能力都沒用到

語言模型真的能用于時序預測嗎&#xff1f;根據貝特里奇頭條定律&#xff08;任何以問號結尾的新聞標題&#xff0c;都能夠用「不」來回答&#xff09;&#xff0c;答案應該是否定的。事實似乎也果然如此&#xff1a;強大如斯的 LLM 并不能很好地處理時序數據。 時序&#xff0…

tkinter-TinUI-xml實戰(11)多功能TinUIxml編輯器

引言 在TinUIXml簡易編輯器中&#xff0c;我們通過TinUI搭建了一個簡易的針對TinUIXml布局的編輯器&#xff0c;基本掌握了TinUIXml布局和TinUIXml的導入與導出。現在&#xff0c;就在此基礎上&#xff0c;對編輯器進行升級。 本次升級的功能&#xff1a; 更合理的xml編輯與…

docker私有倉庫harbor安裝

Harbor默認安裝 下載harbor https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz 目前要求docker版本&#xff0c;docker 20.10.10-ce &#xff0c;和docker-compose 1.18.0 查看 docker-compose版本 docker-compose --ver…

Django前后端打通

跨域問題 【 0 】前言 ? ? 同源策略&#xff08;Same Origin Policy&#xff09;是瀏覽器安全策略的重要組成部分&#xff0c;它限制了來自不同源的網頁之間的數據交互&#xff0c;以防止惡意攻擊。當一個網頁嘗試執行與它的源&#xff08;即協議、域名和端口&#xff09…

【區分vue2和vue3下的element UI Carousel 走馬燈組件,分別詳細介紹屬性,事件,方法如何使用,并舉例】

在 Vue 2 中&#xff0c;我們通常使用 Element UI&#xff0c;而在 Vue 3 中&#xff0c;我們則使用 Element Plus 作為其替代品。對于 Carousel 走馬燈組件&#xff0c;這兩個庫提供了相似的功能&#xff0c;但在 Vue 2 和 Vue 3 的上下文中&#xff0c;它們的屬性、事件和方法…

C\C++ 終端輸出帶有顏色的字符

終端顯示帶有顏色的字符 終端顯示帶有顏色的字符 終端顯示帶有顏色的字符背景&#xff1a;測試機器&#xff0c;win10系統&#xff0c; VS2022編寫字體設置不同的顏色背景色光標移動 &#xff08;這個用的估計不是很多&#xff09;字體設置動態顯示C cout 也可以測試代碼準確的…

接口基礎知識3:詳解url

課程大綱 一、定義 URL即訪問的鏈接&#xff0c;是Uniform Resource Locator的縮寫&#xff0c;譯為"統一資源定位符"。 URL是一種URI&#xff0c;它標識一個互聯網資源&#xff0c;并指定對其進行操作或獲取該資源的方法。可能通過對主要訪問手段的描述&#xff0c…

SpringBoot詳細解析

1.什么是springboot springboot也是spring公司開發的一款框架。為了簡化spring項目的初始化搭建的。那么spring對應springboot有什么缺點呢&#xff1f; spring項目搭建的缺點: 配置麻煩依賴tomcat啟動慢 2.springboot的特點 自動配置 Spring Boot的自動配置是一個運行時&…

Docker 安裝ros 使用rviz 等等圖形化程序

Docker 安裝ros 使用rviz 等等圖形化程序 ubuntu 版本與ros 發行版本對應 如何安裝其它版本ros 此時考慮使用docker 易于維護 地址&#xff1a; https://hub.docker.com/r/osrf/ros 我主機是 ubuntu22.04 使用這個標簽 melodic-desktop-full 1 clone 鏡像到本機 docker pu…

Android OkHttp3中HttpLoggingInterceptor使用

目錄 一 概述1.1 日志級別 二 使用2.1 引入依賴2.2 創建對象2.3 添加攔截器 三 結果展示3.1 日志級別為BODY3.2 日志級別為BASIC3.3 日志級別為HEADERS 參考 一 概述 HttpLoggingInterceptor是OkHttp3提供的攔截器&#xff0c;用來記錄HTTP請求和響應的詳細信息。 1.1 日志級…

基于IDEA的Lombok插件安裝及簡單使用

lombok介紹 Lombok能以注解形式來簡化java代碼&#xff0c;提高開發效率。開發中經常需要寫的javabean&#xff0c;都需要花時間去添加相應的getter/setter&#xff0c;也許還要去寫構造器、equals等方法&#xff0c;而且需要維護。而Lombok能通過注解的方式&#xff0c;在編譯…

Spring AOP 實現 Excel 導出統一處理

你好&#xff0c;我是柳岸花開。在實際開發中&#xff0c;經常會遇到需要導出 Excel 數據的需求。為了避免代碼重復&#xff0c;我們可以使用 Spring AOP&#xff08;面向切面編程&#xff09;來實現 Excel 導出的統一處理。本文將介紹如何使用 Spring AOP 在項目中統一處理 Ex…

【學習筆記】無人機(UAV)在3GPP系統中的增強支持(十三)-更換無人機控制器

引言 本文是3GPP TR 22.829 V17.1.0技術報告&#xff0c;專注于無人機&#xff08;UAV&#xff09;在3GPP系統中的增強支持。文章提出了多個無人機應用場景&#xff0c;分析了相應的能力要求&#xff0c;并建議了新的服務級別要求和關鍵性能指標&#xff08;KPIs&#xff09;。…

枚舉的高階用法之枚舉里寫方法以及注入spring的bean

1、前言 一般我們使用枚舉都是用來定義一些常量。比如我們需要一個表示訂單類(pc訂單、手機訂單)的常量,那我們就可以使用枚舉來實現,如下: AllArgsConstructor public enum OrderTypeEnum{PC("PC", "電腦端"),PHONE("PHONE", "手機端&quo…

[計網初識2]web的3個核心標準html,url,http

學習內容 HTML,URL,HTTP的構成 1.規范web的3個核心標準&#xff1f; HTML(Hyper Text Markup Language),規范網頁內容和版面布局的表示標準。URL(Uniform Resource Locator)&#xff0c;規范網頁識別符格式和含義的表示標準。HTTP(HyperText Transfer Protocl),規范游覽器如…

JIRA的高級搜索JIRA Query Language(JQL)詳解

JIRA的高級搜索功能非常強大&#xff0c;允許用戶通過JIRA Query Language&#xff08;JQL&#xff09;來構建復雜的查詢。以下是一些常用的高級搜索用法和示例&#xff1a; 1. 基本語法 JQL的基本語法包括字段、運算符和值的組合。例如&#xff1a; field operator value2.…