(四) python門面模式

文章目錄

  • 4.1 結構型設計模式
    • 4.1.1 簡介
    • 4.1.2 常見的幾種結構型設計模式
  • 4.2 理解門面設計模式
    • 4.2.1 門面設計模式概述
    • 4.2.2 門面設計模式的作用
  • 4.3 UML類圖
    • 4.3.1 門面
    • 4.3.2 系統
    • 4.3.3 客戶端
  • 4.4 門面模式的代碼實現
    • 4.4.1 場景:
    • 4.4.2 python實現
  • 4.5 原理:最少知識原則
  • 4.6 門面模式的優缺點
    • 4.6.1 門面模式優點
    • 4.6.2 門面模式缺點

門面模式屬于結構型設計模式的一種,下面我們先了解一下結構型設計模式:

4.1 結構型設計模式

4.1.1 簡介

● 結構型模式描述如何將對象和類組合成更大的結構。
● 結構型模式是一種能夠簡化設計工作的模式,因為它能夠找出更簡單的方法來認識或表示實體之間的關系。
● 在面向對象世界中,實體指的是對象或類。
● 類模式可以通過繼承來描述抽象,從而提供更有用的程序接口,而對象模式則描述了如何將對象聯系起來從而組合成更大的對象。結構型模式是類和對象模式的綜合體。

4.1.2 常見的幾種結構型設計模式

下面給出結構型設計模式的幾個例子。你會注意到,它們都是通過對象或類之間的交互來實現更高級的設計或架構目標的。
● 適配器模式:將一個接口轉換成客戶希望的另外一個接口。它試圖根據客戶端的需求來匹配不同類的接口。
● 橋接模式:該模式將對象的接口與其實現進行解耦,使得兩者可以獨立工作。
● 裝飾器模式:該模式允許在運行時或以動態方式為對象添加職責。我們可以通過接口給對象添加某些屬性。

4.2 理解門面設計模式

4.2.1 門面設計模式概述

門面(facade)在隱藏內部系統復雜性的同時,為客戶端提供了一個接口,以便它們可以非常輕松地訪問系統。下面,我們以店主為例進行介紹。
現在,假設你要到某個商店去買東西,但是你對這個商店的布局并不清楚。通常情況下,你會去找店主,因為店主對整個商店都很清楚。只要你告訴他/她要買什么,店主就會把這些商品拿給你。這不是很容易嗎?顧客不必了解店面的情況,可以通過一個簡單的接口來完成購物,這里的接口就是店主。

4.2.2 門面設計模式的作用

門面設計模式實際上完成了下列事項
● 它為子系統中的一組接口提供一個統一的接口,并定義一個高級接口來幫助客戶端通過更加簡單的方式使用子系統。
● 門面所解決問題是,如何用單個接口對象來表示復雜的子系統。實際上,它并不是封裝子系統,而是對底層子系統進行組合。
● 它促進了實現與多個客戶端的解耦。

4.3 UML類圖

在這里插入圖片描述

就像你在UML圖中看到的那樣,這個模式有3個主要的參與者:
● 門面:門面的主要責任是,將一組復雜導致系統封裝起來,從而為外部世界提供一個舒適的外觀。
● 系統:這代表一組不同的子系統,使整個系統混雜在一起,難以觀察或使用
● 客戶端:客戶端與門面進行交互,這樣就可以輕松地與子系統進行通信并完成工作了。不必擔心系統的復雜性。
下面,我們將會從數據結構的角度進一步介紹這3個主要參與者。

4.3.1 門面

以下幾點可以幫助我們更好地理解門面
● ·它是一個接口,它知道某個請求可以交由哪個子系統進行處理。
● 它使用組合將客戶端的請求委派給相應的子系統對象。例如,如果客戶端正在了解哪些工作已完成,則不需要到各個子系統去,相反,它只需要聯系完成工作的接口(門面)就可以了

4.3.2 系統

在門面的世界里,系統就是執行以下操作的實體
● 它實現子系統的功能,同時,系統由一個類表示。理想情況下,系統應該由一組負責不同任務的類來表示。
● 它處理門面對象分配的工作,但并不知道門面,而且不引用它。
例如,當客戶端向門面請求某項服務時,門面會根據服務的類型來選擇提供該服務的相應子系統。

4.3.3 客戶端

以下是我們對客戶端的描述
● 客戶端是實例化門面的類
● 為了讓子系統完成相應的工作,客戶端需要向門面提出請求。

4.4 門面模式的代碼實現

4.4.1 場景:

假設你要在家中舉行一場婚禮,并且由你來張羅這一切。這真是一個艱巨的任務。你必須預訂一家酒店或場地,與餐飲人員交代酒菜、布置場景,并安排背景音樂。
之前,你可能需要自己搞定一切,例如找相關人員談話、與他們進行協調、敲定價格等。那么現在你就很輕松了,你可以直接去找會務經理,讓他為你處理這些事情。會務經理負責跟各個服務提供商交涉,并為你爭取最優惠的價格。

4.4.2 python實現

#!/usr/bin/env python
# -*- coding: UTF-8 -*-# 門面類 會務經理:通過組合創建子系統的對象
class EventManager(object):def __init__(self):print("Event Manager:: Let me talk to the folks\n")def arrange(self):self.hotelier = Hotelier()self.hotelier.bookHotel()  # 定酒店self.florist = Florist()self.florist.setFlowerRequirements()  # 定花self.caterer = Caterer()self.caterer.setCuisine()  # 準備宴席self.musician = Musician()self.musician.setCuisine()# 門下調用的子系統1
class Hotelier(object):def __init__(self):print("Arranging the Hotel for Marriage? --")def __isAvailable(self):print("Is the Hotel free for the event on given day?")return Truedef bookHotel(self):if self.__isAvailable():print("Registered the Booking\n\n")# 門下調用的子系統
class Florist(object):def __init__(self):print("Flower Decorations for the Event? --")def setFlowerRequirements(self):print("Carnations,Roses and Lilies would be used for Decorations \n")# 門下調用的子系統
class Caterer(object):def __init__(self):print("Food Arrangements for the Event --")def setCuisine(self):print("Chinese & Continental Cuisine to be served\nin")# 門下調用的子系統
class Musician(object):def __init__(self):print("Musical Arrangements for the Marriage --")def setCuisine(self):print("Chinese & Continental Cuisine to be served\n\n")# 客戶端類,調用門面的一方
class You(object):def __init__(self):print("開始籌備一場婚禮!!!")def askEventManager(self):print("聯系門面類,讓其來組織各項事務\n\n")em = EventManager()em.arrange()def __del__(self):print("籌備結束!!!")# 調用
you = You()
you.askEventManager()

4.5 原理:最少知識原則

門面模式背后的設計原理就是最少知識原則,它指導我們設計系統時要減少對象之間的交互,就像跟你親近的只有某幾個朋友那樣。實際上,它意味著:
● 在設計系統時,對于創建的每個對象,都應該考察與之交互的類的數量,以及交互的方式;
● 遵循這個原則,就能夠避免創建許多彼此緊密耦合的類的情況;
● 如果類之間存在大量依賴關系,那么系統就會變得難以維護。如果對系統中的任何部分進行修改,都可能導致系統的其他部分被無意改變,這意味著系統會退化是應該堅決避免的。

4.6 門面模式的優缺點

4.6.1 門面模式優點

由于門面模式提供了簡化的接口,這使得客戶端不必擔心子系統的復雜性;

4.6.2 門面模式缺點

門面提供了一個簡化的接口供客戶端與子系統交互。本著提供簡化接口的精神,應用可能會建立多個不必要的接口,這就增加了系統的復雜性并且降低了運行時的性能。

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

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

相關文章

Compose for iOS:kotlin 與 swift 互操作

前言 類似于 Android 上的 compose,在 iOS 上的 compose 同樣支持嵌套顯示 compose UI 和 swiftUI 或是 uikit 。 但是不同于 Android 原生就是使用 kotlin 作為開發語言,iOS 的開發語言是 swift 或者 object-c 。雖然大多數業務邏輯都可以直接使用 ko…

渲染(iOS渲染過程解析)

渲染 渲染原理 一個硬核硬件科普視頻 CPU和GPU CPU(Central Processing Unit):現代計算機整個系統的運算核心、控制核心,適合串行計算。GPU(Graphics Processing Unit):可進行繪圖運算工作的…

安防音頻接口選型的高性能國產芯片分析

在人工智能興起之后,安防市場就成為了其全球最大的市場,也是成功落地的最主要場景之一。對于安防應用而言,智慧攝像頭、智慧交通、智慧城市等概念的不斷涌現,對于芯片產業催生出海量需求。今天,我將為大家梳理GLOBALCH…

springboot_3.2_freemark_基礎環境配置

springboot_3.2_freemark_基礎環境配置 一、前言二、環境三、相關資料四、目標五、默認配置項六、構建springboot 3.2項目6.1 pom.xml 內容:6.2 啟動類6.3 添加ftlh模板6.4 controller內容6.5 bootstrap.yml配置 七、總結 一、前言 FreeMarker 是一款模板引擎&…

Linux——緩沖區與實現C庫的fopen,fwrite,fclose

目錄 一.緩沖區 1緩沖區的概念 2.緩沖區存在的意義 3.緩沖區刷新策略 4.什么是刷新? C語言的緩沖區在哪里? ?編輯 仿寫C庫里的fopen,fclose,fwrite。 mystdio.h mystdio.c main.c(向文件中寫入20次msg) 一.緩沖區 1…

b站pwn的學習總結

寫的很亂 1.c語言的運行過程 了解了c語言需要經過以上2個過程(編譯和匯編),才能讓機器按指令運行。機器只能聽得懂機器碼,所以要“匯編”。 那問題就來了,“編譯”這個動作有啥用,c語言這種高級語言&…

玩轉大數據10:深度學習與神經網絡在大數據中的應用

目錄 1. 引言:深度學習和神經網絡在大數據中的重要性和應用場景 2. 深度學習的基本概念和架構 3. Java中的深度學習框架 3.1. Deeplearning4j框架介紹及Java編程模型 3.2. DL4J、Keras和TensorFlow的集成 4. 大數據與深度學習的結合 4.1. 大數據與深度學…

電腦端同時登錄多個微信

1、建立一個txt文件 2、右擊微信查看應用的屬性,記錄文件的位置 3、將步驟二得到的路徑按照下方的格式輸入到步驟一的文本中 4、保存之后將文本后綴名的.txt改成.bat 5、在未登錄微信的情況下,雙擊即可得到兩個微信登錄窗口

Python高級算法——回溯法(Backtracking)

Python中的回溯法(Backtracking):高級算法解析 回溯法是一種通過嘗試所有可能的解來找到問題解的算法設計方法。它通常應用于組合問題、排列問題、子集問題等。在本文中,我們將深入講解Python中的回溯法,包括基本概念…

解決oracle.sql.TIMESTAMP序列化轉換失敗問題 及 J2EE13Compliant原理

目錄 報錯現象報錯內容處理方法Oracle驅動源碼總結 報錯現象 oracle表中存在TIMESTAMP類型的列時,jdbc查出來做序列化時報錯 報錯內容 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframewo…

x86和ARM中配置無線網SSID和PASSWORD

提供一個可行的方法 1.準備文件 hostapd.conf :是用戶控件的守護進程用于無線接入點(AP)和授權服務器(authentication servers),存放路徑:/etc/hostapd/hostapd.conf interfacewlp5s0 drivernl80211 chan…

Java中多線程中 synchronized 鎖升級的原理是什么?

Java中多線程中 synchronized 鎖升級的原理是什么? 在 Java 中,synchronized 鎖的升級是指在不同的場景下,鎖的性能優化。Java 的鎖有多個狀態,主要包括偏向鎖、輕量級鎖和重量級鎖。 偏向鎖:當只有一個線程訪問同步塊…

acwing算法提高之動態規劃--背包模型(三)

目錄 1 基礎知識2 模板3 工程化 1 基礎知識 暫無。。。 2 模板 暫無。。。 3 工程化 題目1:潛水員。 解題思路:DP。 狀態定義f[i][j][k]:從前i個物品中選,氧氣至少為j,氮氣至少為k的最小方案數。 狀態轉移&…

解決idea 通過build project 手動觸發熱部署失敗

在debug運行項目的過程中,并且保證(不添加方法,不修改方法名)一定的規則的情況下,可以通過build project 來手動熱部署項目,也就是會交換class文件與resouces文件。 設置項 Edit Configurations Modify Op…

計算機圖形學理論(1):建模基礎

本系列根據國外一個圖形小哥的講解為本,整合互聯網的一些資料,結合自己的一些理解。 場景的組成部分 場景相當于一個或多個模型的集合。模型包含以下內容: 結構描述:幾何形狀,如頂點、紋理坐標等表面描述&#xff1a…

Vue3中的defineModel

目錄 一、vue3的defineModel介紹 二、defineModel使用 (1)在vite.config.js中開啟 (2)子組件 (3)父組件 一、vue3的defineModel介紹 為什么要使用到defineModel呢?這里有這樣一種場景&…

“快速排序:一種美麗的算法混沌”(1.hoare)

歡迎來到我的博客!在今天的文章中,我將采用一種獨特且直觀的方式來探討我們的主題:我會使用一幅圖像來貫穿整篇文章的講解。這幅精心設計的圖表不僅是我們討論的核心,也是一個視覺輔助工具,幫助你更深入地理解和掌握本…

學習深度強化學習---第2部分----RL動態規劃相關算法

文章目錄 2.1節 動態規劃簡介2.2節 值函數與貝爾曼方程2.3節 策略評估2.4節 策略改進2.5節 最優值函數與最優策略2.6節 值迭代與策略迭代2.7節 動態規劃求解最優策略 本部分視頻所在地址:深度強化學習的理論與實踐 2.1節 動態規劃簡介 態規劃有兩種思路&#xff1…

前端 Web Workers 簡介

簡介 以前我們總說,JS 是單線程沒有多線程,當 JS 在頁面中運行長耗時同步任務的時候就會導致頁面假死影響用戶體驗,從而需要設置把任務放在任務隊列中;執行任務隊列中的任務也并非多線程進行的,然而現在 HTML5 提供了…

App備案、ios備案Bundle ID查詢、公鑰信息、SHA-1值

App備案、ios備案Bundle ID查詢、公鑰信息、SHA-1值 Bundle ID這個就不說了,都知道是啥,主要說公鑰信息和SHA-1值的獲取 打開鑰匙串訪問,找到當前需要備案App的dis證書,如下: #####右鍵點擊顯示簡介 #####可以看…