GO設計模式——12、外觀模式(結構型)

目錄

外觀模式(Facade Pattern)

外觀模式的核心角色:

優缺點

使用場景

代碼實現


外觀模式(Facade Pattern)

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

外觀模式的核心角色

  • 外觀(Facade):外觀對象是客戶端與子系統之間的中間層,它提供了一個簡化的接口,將客戶端的請求委派給子系統處理,用于訪問子系統中的一組接口。外觀對象知道哪些子系統類負責處理請求,并將請求分派給它們。
  • 子系統(Subsystem):包含一組類或接口,實現了子系統的功能。子系統是實現具體功能的一組類或接口。外觀對象將客戶端的請求轉發給適當的子系統類進行處理。

優缺點

(1)優點:

  • 降低了子系統與客戶端之間的耦合度,使得子系統的變化不會影響調用它的客戶類。
  • 對客戶屏蔽了子系統組件,減少了客戶處理的對象數目,并使得子系統使用起來更加容易。
  • 降低了大型軟件系統中的編譯依賴性,簡化了系統在不同平臺之間的移植過程,因為編譯一個子系統不會影響其他的子系統,也不會影響外觀對象。

(2)缺點:

  • 不能很好地限制客戶使用子系統類,很容易帶來未知風險。
  • 增加新的子系統可能需要修改外觀類或客戶端的源代碼,違背了“開閉原則”。

使用場景

  • 為復雜的模塊或子系統提供外界訪問的模塊。
  • 子系統相對獨立。
  • 預防低水平人員帶來的風險。

代碼實現

package mainimport "fmt"// 一個文件壓縮工具,需要提供壓縮和解壓縮功能。壓縮功能涉及到文件的讀取、壓縮算法的選擇和壓縮文件的寫入,
// 而解壓縮功能涉及到文件的讀取、解壓縮算法的選擇和解壓縮文件的寫入。我們希望能夠通過一個簡單的接口來調用這些復雜的功能。// 子系統:文件讀取
type FileReader struct {
}func (f *FileReader) ReadFile(fileName string) string {return "File Content"
}// 子系統:壓縮算法
type Compressor struct {
}func (c *Compressor) Compress(data string) string {return "Compressed Data"
}// 子系統:文件寫入
type FileWriter struct {
}func (w *FileWriter) WriteFile(fileName string, data string) {fmt.Printf("Write data '%s' to file '%s'\n", data, fileName)
}// 外觀:文件壓縮工具
type FileCompressionFacade struct {reader     *FileReadercompressor *Compressorwriter     *FileWriter
}func NewFileCompressionFacade() *FileCompressionFacade {return &FileCompressionFacade{reader:     &FileReader{},compressor: &Compressor{},writer:     &FileWriter{},}
}
func (f *FileCompressionFacade) CompressFile(fileName string) {fmt.Println("Compressing file:", fileName)// 讀取文件data := f.reader.ReadFile(fileName)// 壓縮數據compressedData := f.compressor.Compress(data)// 寫入壓縮文件f.writer.WriteFile(fileName+".zip", compressedData)fmt.Println("File compression completed.")
}// 客戶端代碼
func main() {facade := NewFileCompressionFacade()facade.CompressFile("example.txt")
}

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

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

相關文章

IntelliJ IDEA的下載安裝配置步驟詳解

引言 IntelliJ IDEA 是一款功能強大的集成開發環境,它具有許多優勢,適用于各種開發過程。本文將介紹 IDEA 的主要優勢,并提供詳細的安裝配置步驟。 介紹 IntelliJ IDEA(以下簡稱 IDEA)之所以被廣泛使用,…

docker鏡像倉庫hub.docker.com無法訪問

docker鏡像倉庫hub.docker.com無法訪問 文章主要內容: 介紹dockerhub為什么無法訪問解決辦法 1 介紹dockerhub為什么無法訪問 最近許多群友都詢問為什么無法訪問Docker鏡像倉庫,于是我也嘗試去訪問,結果果然無法訪問。 大家的第一反應就是…

HDFS常見題

1. 談談什么是Hadoop? Hadoop是一個開源軟件框架,用于存儲大量數據,并發計算/查詢節點的集群上的數據。   Hadoop包括以下內容:     HDFS(Hadoop Distributed File System):Hadoop分布式文件存儲系統。     MapReduce&…

【華為OD題庫-084】最長連續子序列-Java

題目 有N個正整數組成的一個序列。給定整數sum,求長度最長的連續子序列,使他們的和等于sum,返回此子序列的長度。如果沒有滿足要求的序列,返回-1。 輸入描述 第一行輸入是:N個正整數組成的一個序列 第二行輸入是:給定整數sum 輸出…

nodejs fs模塊

是什么:nodejs提供的操作文件的模塊 fs.readFile() fs.writeFile() js中使用 fs模塊操作文件,先導入fs const fsrequire(fs)fs.readFile() 讀取指定文件的內容 語法格式 fs.readFile(path[, options], callback) path:必選參數&#x…

參數是Id,但要顯示接口中的id對應的名稱

當下拉數據是個接口&#xff0c;且后臺表單和列表中給的參數是Id,但要顯示接口中的id對應的名稱 先在data中定義要顯示的名稱 productName 1.form下拉 <el-form-item label"產品名稱" prop"productId"><el-select v-model"queryParams.produ…

初學vue3與ts:keep-alive的簡單使用

vue2用法 <keep-alive :include"keepAliveNames"><router-view></router-view> </keep-alive> <script>//include代表緩存name是FleetList的組件this.keepAliveNames FleetList </script>vue3用法 <router-view v-slot&qu…

數組循環:使用 for-of 循環

首先我們先創建一個數組&#xff0c;從之前的對象中取得 const menu [...restaurant.starterMenu,...restaurant.mainMenu];在之前&#xff0c;我們如果想要打印數組中的每一個數據&#xff0c;我們通常會寫for循環來一個一個打印出來&#xff0c;現在我們可以使用for-of循環…

Elasticsearch:什么是檢索增強生成 (RAG)?

檢索增強生成 (RAG) 定義 檢索增強生成 (RAG) 是一種利用來自私有或專有數據源的信息來補充文本生成的技術。 它將旨在搜索大型數據集或知識庫的檢索模型與大型語言模型 (LLM) 等生成模型相結合&#xff0c;后者獲取該信息并生成可讀的文本響應。 檢索增強生成可以通過添加來…

在線客服系統有哪些接入方式?

在線客服系統在當今的商業環境中還是非常重要的角色的。它通過提供實時又個性化的客戶服務&#xff0c;讓客戶滿意的同時還能提高轉化率&#xff0c;更能維護品牌形象。然而企業在選擇在線客服系統時必須了解不同的接入方式&#xff0c;以便選擇最適合自己的方式。下面我以合從…

消費升級:無人零售的崛起與優勢

消費升級&#xff1a;無人零售的崛起與優勢 隨著人們生活水平的提高&#xff0c;消費內容正在從生存型消費轉向以精神體驗和享樂為主的發展型消費。社會居民的消費結構不斷變遷&#xff0c;明顯呈現消費升級趨勢。個性化和多元化消費勢頭正在崛起&#xff0c;特別是無人零售的自…

【教學類-35-02】20231207大班姓名描字帖:A4單面3*10個姓名,雙面共60個名字

背景需求&#xff1a; 需求1——需要字帖 大4班班主任說&#xff1a;你能給我們班孩子做一套寫名字的字帖嗎&#xff1f;我想讓他們練習寫名字。 我說&#xff1a;沒問題。我找找已經有的樣式給你看看&#xff0c;再打印。 打開電腦&#xff0c;我把曾經做的一套“大字貼”…

測試:API接口測試

API接口測試 API接口測試是確保應用程序編程接口&#xff08;API&#xff09;在開發過程中正確實現并滿足預定功能要求的過程。API是不同軟件之間交流的橋梁&#xff0c;負責數據的傳輸、交換和控制。進行API測試的目的是驗證API的功能、性能、安全性和兼容性。 API接口測試的…

【Linux系統化學習】進程地址空間 | 虛擬地址和物理地址的關系

個人主頁點擊直達&#xff1a;小白不是程序媛 Linux專欄&#xff1a;Linux系統化學習 代碼倉庫&#xff1a;Gitee 目錄 虛擬地址和物理地址 頁表 進程地址空間 進程地址空間存在的意義 虛擬地址和物理地址 我們在學習C/C的時候肯定都見過下面這張有關于內存分布的圖片&a…

SQL Server 數據庫,多表查詢

4.2使用T-SQL實現多表查詢 前面講述過的所有查詢都是基于單個數據庫表的查詢&#xff0c;如果一個查詢需要對多個表進行操作&#xff0c; 就稱為聯接查詢&#xff0c;聯接查詢的結果集或結果稱為表之間的聯接。 聯接查詢實際上是通過各個表之間共同列的關聯性來查詢數據的&…

微信小程序 bindtap 事件多參數傳遞

在微信小程序中&#xff0c;我們無法直接通過 bindtap"handleClick(1,2,3)" 的方式傳遞參數&#xff0c;而是需要通過自定義屬性 data- 的方式進行傳遞&#xff0c;并在事件回調函數中通過 event.currentTarget.dataset 來獲取這些參數。然而&#xff0c;這種傳參方式…

跨框架解決方案-Mitosis【Context】

Context Mitosis的context必須是&#xff1a; 在自己的文件中創建文件名必須以context.lite.ts結尾默認導出必須是一個返回context對象的函數 // simple.context.lite.ts import { createContext } from builder.io/mitosis;export default createContext({foo: bar,get foo…

速查!軟考出成績了

2023年11月軟考成績出來啦&#xff01;大家趕緊查一下&#xff0c;各科都45分就是通過&#xff01; 01 如何查成績 1、打開“中國計算機技術職業資格網”&#xff0c;網址&#xff1a;https://www.ruankao.org.cn/ 2、點擊↘的“成績查詢”按鈕。 3、輸入“手機號/證件號密碼驗…

光伏儲能IC

光伏儲能IC 電子元器件百科 文章目錄 光伏儲能IC前言一、光伏儲能IC是什么二、光伏儲能IC的類別三、光伏儲能IC的應用實例四、光伏儲能IC的作用原理總結前言 光伏儲能IC可以提高光伏發電和儲能系統的效率和穩定性,同時提供智能化的管理和控制功能。它在光伏發電和儲能領域具有…

船舶機電設備智能故障診斷系統

1 船舶電氣設備故障診斷專家系統 體系結構 整個系統的體系結構采用瀏覽器&#xff0f; 服務器 &#xff08;B&#xff0f; S&#xff09; 三層體系結構 &#xff08; 如圖 1 所示 &#xff09;。B&#xff0f;S 模式是一種 以 Web 技術為基礎的系統平臺模式 。 把傳統…