【Python設計模式10】外觀模式

外觀模式(Facade Pattern)是一種結構型設計模式,它通過提供一個統一的接口,來簡化客戶端與復雜系統之間的交互。外觀模式為子系統中的一組接口提供一個高層接口,使得子系統更容易使用。

外觀模式的結構

外觀模式主要包括以下幾個角色:

  1. 外觀(Facade):提供一個高層接口,簡化客戶端對子系統的使用。
  2. 子系統(Subsystem):一組復雜的類、庫或子系統,它們實現了系統的具體功能。

外觀模式的示例

假設我們有一個復雜的家庭影院系統,包括多個子系統如DVD播放器、投影儀、燈光系統和音響系統。我們可以使用外觀模式來簡化這些子系統的使用。

定義子系統類
class DVDPlayer:def on(self):print("DVD Player is on")def play(self, movie: str):print(f"Playing movie: {movie}")def off(self):print("DVD Player is off")class Projector:def on(self):print("Projector is on")def off(self):print("Projector is off")class Lights:def dim(self, level: int):print(f"Lights dimmed to {level}%")class SoundSystem:def on(self):print("Sound System is on")def off(self):print("Sound System is off")
定義外觀類
class HomeTheaterFacade:def __init__(self, dvd: DVDPlayer, projector: Projector, lights: Lights, sound: SoundSystem):self.dvd = dvdself.projector = projectorself.lights = lightsself.sound = sounddef watch_movie(self, movie: str):print("Get ready to watch a movie...")self.lights.dim(10)self.projector.on()self.sound.on()self.dvd.on()self.dvd.play(movie)def end_movie(self):print("Shutting movie theater down...")self.dvd.off()self.sound.off()self.projector.off()self.lights.dim(100)
使用外觀模式
def main():dvd = DVDPlayer()projector = Projector()lights = Lights()sound = SoundSystem()home_theater = HomeTheaterFacade(dvd, projector, lights, sound)home_theater.watch_movie("Inception")home_theater.end_movie()if __name__ == "__main__":main()

在這個示例中,DVDPlayerProjectorLightsSoundSystem是子系統類,HomeTheaterFacade是外觀類,它簡化了客戶端對家庭影院系統的使用。客戶端只需與HomeTheaterFacade交互,而不需要直接操作各個子系統。

外觀模式的優缺點

優點
  1. 簡化接口:外觀模式提供了一個簡化的接口,使得子系統更容易使用。
  2. 減少依賴:客戶端與子系統之間的耦合度降低,通過外觀類進行交互,減少了客戶端與子系統的直接依賴。
  3. 提高靈活性:可以在不修改客戶端代碼的情況下更改子系統的實現,只需調整外觀類的實現即可。
缺點
  1. 增加額外的抽象層:引入外觀模式會增加一個額外的抽象層,可能會導致代碼的復雜性增加。
  2. 過度封裝:如果過度使用外觀模式,可能會掩蓋子系統的功能,導致靈活性下降。

外觀模式的適用場景

  1. 簡化復雜系統的使用:當一個系統非常復雜,使用起來不方便時,可以使用外觀模式提供一個簡化的接口。
  2. 減少系統間的依賴:當需要減少系統之間的耦合度時,可以使用外觀模式,將客戶端與子系統之間的交互通過外觀類進行隔離。
  3. 分層系統:在分層系統中,可以使用外觀模式為每一層提供一個簡化的接口,從而簡化各層之間的交互。

總結

外觀模式是一種結構型設計模式,通過提供一個統一的高層接口,簡化客戶端與復雜系統之間的交互。外觀模式適用于簡化復雜系統的使用、減少系統間的依賴和分層系統等場景。合理應用外觀模式,可以提高系統的可維護性和可擴展性,使得系統更加易用和靈活。理解并掌握外觀模式,有助于在實際開發中構建高效、易維護的系統。

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

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

相關文章

【學習心得】超簡單的加載模型和保存模型的方法

方法一:pickle庫 這是Python的標準序列化模塊,可以將幾乎任何Python對象轉化為字節流(即序列化),然后可以將其存儲到文件中或通過網絡發送。之后,可以使用pickle再次加載這個字節流,恢復原始對象…

Linux shell命令

cat 文件名 查看文件內容, tac文件名 倒著顯示。 more 文件名 顯示內容 less文件名 和more的功能一樣,按上下左右鍵,按Q鍵結束。 head文件名,只顯示前10行內容。 ln是一個默認創建硬鏈接的命令 ln 文件名 ls -i文件名…

全棧:Web 用戶登錄過程實例與Cookie管理

用戶創建與使用cookie全過程 1.用戶訪問網站 當用戶使用瀏覽器訪問一個網站時,瀏覽器會向服務器發送一個HTTP請求。 2. 服務器響應請求 服務器接收到HTTP請求后,會處理請求并準備響應。如果服務器需要設置Cookie,它會在HTTP響應頭中包含一…

SpringBoot整合RabbitMQ的快速使用教程

目錄 一、引入依賴 二、配置rabbitmq的連接信息等 1、生產者配置 2、消費者配置 三、設置消息轉換器 四、生產者代碼示例 1、配置交換機和隊列信息 2、生產消息代碼 五、消費者代碼示例 1、消費層代碼 2、業務層代碼 在分布式系統中,消息隊列是一種重要…

#職場發展#其他

一閃論文是目前市場上一款非常靠譜的論文寫作工具,不僅可以幫助用戶快速完成論文撰寫,還能對文章進行查重降重,確保內容原創性。從用戶的角度來看,一閃論文確實是一個非常方便、實用的工具,能夠大大提高寫作效率&#…

00Java準備工作

目錄 JDK的安裝目錄 JAVA環境變量的配置 JAVA小知識 JDK的安裝目錄 目錄名稱說明bin該路徑下存放了JDK的各種工具命令,javac和java就放在這個目錄conf該路徑下存放了JDK的相關配置文件include該路徑下存放了一些平臺特定的頭文件jmods該路徑下存放了JDK的各種模塊legal該路…

簡單隨機數據算法

文章目錄 一,需求概述二,實現代碼三、測試代碼四、測試結果五、源碼傳送六、效果演示 一,需求概述 系統啟動時,讀取一組圖片數據,通過接口返回給前臺,要求: 圖片隨機相鄰圖片不重復 二&#…

Java數據結構與算法(散列表)

前言 散列表是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。而key的沖突主要通過鏈表的方式來處理,后期鏈表過長情況下可以通過紅黑樹來優化查詢效率。 實…

進程互斥經典問題(讀寫者問題、理發店問題)

目錄 讀寫者問題 問題描述 問題分析 進程互斥問題三部曲 讀者寫者算法實現 一、找進程——確定進程關系 二、找主營業務 三、找同步約束 a.互斥 b.資源 c.配額 理發店問題 問題描述 問題分析 進程互斥問題三部曲 理發店問題算法實現 一、找進程——確定進程…

SB-OSC,最新的 MySQL Schema 在線變更方案

目前主流的 MySQL 在線變更方案有兩個: 基于 trigger 的 pt-online-schema-change基于 binlog 的 gh-ost 上周 Sendbird 剛開源了他們的 MySQL Schema 在線變更方案 SB-OSC: Sendbird Online Schema Change。 GitHub 上剛剛 25 顆星星,絕對新鮮出爐。 …

Qt Creator(2)【如何在Qt Creator中創建新工程】

閱讀導航 引言一、Qt Creator開始界面介紹二、如何在Qt Creator中創建新工程1. 新建項目2. 選擇項目模板3. 選擇項目路徑4. 選擇構建系統5. 填寫類信息設置界面6. 選擇語言和翻譯文件7. 選擇Qt套件8. 選擇版本控制系統9. 最終效果 三、認識Qt Creator項目內容界面1. 基本界面2.…

React Native 之 處理觸摸事件(八)

React Native 提供了可以處理常見觸摸手勢&#xff08;例如點擊或滑動&#xff09;的組件&#xff0c; 以及可用于識別更復雜的手勢的完整的手勢響應系統。 Button是一個簡單的跨平臺的按鈕組件。下面是一個最簡示例&#xff1a; <ButtononPress{() > {Alert.alert(你點…

go語言初識別(五)

本博客內容涉及到&#xff1a;切片 切片 1. 切片的概念 首先先對數組進行一下回顧&#xff1a; 數組定義完&#xff0c;長度是固定的&#xff0c;例如&#xff1a; var num [5]int [5]int{1,2,3,4,5}定義的num數組長度是5&#xff0c;表示只能存儲5個整形數字&#xff0c…

檢索模型預訓練方法:RetroMAE

論文title&#xff1a;https://arxiv.org/pdf/2205.12035RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder 論文鏈接&#xff1a;https://arxiv.org/pdf/2205.12035 摘要 1.一種新的MAE工作流&#xff0c;編碼器和解器輸入進行了不同的掩…

華為OD機試【計算最接近的數】(java)(100分)

1、題目描述 給定一個數組X和正整數K&#xff0c;請找出使表達式X[i] - X[i1] … - X[i K 1]&#xff0c;結果最接近于數組中位數的下標i&#xff0c;如果有多個i滿足條件&#xff0c;請返回最大的i。 其中&#xff0c;數組中位數&#xff1a;長度為N的數組&#xff0c;按照元…

軟件性能測試有哪些測試類型和方法?

軟件性能測試是一種通過模擬真實用戶使用情況&#xff0c;評估軟件系統在各種壓力和負載下的表現的測試方法。在今天這個講究效率的時代&#xff0c;軟件性能測試是不可或缺的一環。它能幫助開發人員和企業發現潛在的性能問題&#xff0c;提前優化改進&#xff0c;保證軟件系統…

Flutter 中的 SizeChangedLayoutNotifier 小部件:全面指南

Flutter 中的 SizeChangedLayoutNotifier 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;SizeChangedLayoutNotifier 是一種特殊的小部件&#xff0c;它用于監聽其子組件尺寸的變化。當子組件的大小發生變化時&#xff0c;SizeChangedLayoutNotifier 可以通知其他組件…

動態內存管理—C語言通訊錄

目錄 一&#xff0c;動態內存函數的介紹 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的內存開辟 二&#xff0c;通訊錄管理系統 動態內存函數的介紹 malloc free calloc realloc 一&#xff0c;動態內存函數的介紹 1.1 malloc和free void* malloc (…

回文鏈表(快慢指針解法之在推進過程中反轉)

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd;抱怨深處黑暗&#xff0c;不如提燈前行…

進程間通信IPC機制

進程間通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同進程之間傳播或交換信息。IPC機制有多種方式&#xff0c;每種方式都有其特定的工作原理、應用場景以及優缺點。以下是對幾種主要IPC方式的詳細解釋&#xff1a; 管道&#xff08;Pipe&a…