[go] 橋接模式

橋接模式

是一種結構型設計模式, 可將一個大類或一系列緊密相關的類拆分為抽象和實現兩個獨立的層次結構, 從而能在開發時分別使用。

模型說明

  • 抽象部分(Abstraction)提供高層控制邏輯,依賴于完成底層實際工作的實現對象。

  • 實現部分(Implementation)為所有具體實現聲明通用接口。抽象部分僅能通過在這里聲明的方法與實現對象交互。

  • 抽象部分可以列出和實現部分一樣的方法,但是抽象部分通常聲明一些復雜行為,這些行為依賴于多種由實現部分聲明的原語操作。

  • 具體實現(Concrete Implementations)中包括特定于平臺的代碼。

  • 精確抽象(Refined Abstraction)提供控制邏輯的變體。與其父類一樣,它們通過通用實現接口與不同的實現進行交互。

  • 通常情況下,客戶端(Client)僅關心如何與抽象部分合作。但是,客戶端需要將抽象對象與一個實現對象連接起來。

優缺點

1.優點

  • 你可以創建與平臺無關的類和程序。
  • 客戶端代碼僅與高層抽象部分進行互動,不會接觸到平臺的詳細信息。
  • *開閉原則:*你可以新增抽象部分和實現部分,且它們之間不會相互影響。
  • *單一職責原則:*抽象部分專注于處理高層邏輯, 實現部分處理平臺細節。

2.缺點

  • 對高內聚的類使用該模式可能會讓代碼更加復雜。

使用場景

  • 如果你想要拆分或重組一個具有多重功能的龐雜類(例如能與多個數據庫服務器進行交互的類),可以使用橋接模式。
  • 如果你希望在幾個獨立維度上擴展一個類,可使用該模式。
  • 如果你需要在運行時切換不同實現方法,可使用橋接模式。

參考代碼

如果我們有一臺Mac和一臺Windows。還有兩臺打印機:愛普生和惠普。這兩臺電腦和打印機可能會任意組合使用。 客戶端不應去擔心如何將打印機連接至計算機的細節問題。
computer.go 抽象部分(高層控制)

package mainimport "fmt"type Computer interface {Print()SetPrinter(Printer)
}type Mac struct {printer Printer
}func (m *Mac) Print() {fmt.Println("Print request for mac")m.printer.PrintFile()
}func (m *Mac) SetPrinter(p Printer) {m.printer = p
}type Windows struct {printer Printer
}func (w *Windows) Print() {fmt.Println("Print request for windows")w.printer.PrintFile()
}func (w *Windows) SetPrinter(p Printer) {w.printer = p
}

priter.go 實現部分(底層實際工作)

package mainimport "fmt"type Printer interface {PrintFile()
}type Epson struct{}func (p *Epson) PrintFile() {fmt.Println("Printing by a EPSON Printer")
}type Hp struct{}func (p *Hp) PrintFile() {fmt.Println("Printing by a HP Printer")
}

main.go 客戶端

package mainimport "fmt"func main() {hpPrinter := &Hp{}epsonPrinter := &Epson{}macComputer := &Mac{}macComputer.SetPrinter(hpPrinter)macComputer.Print()fmt.Println()macComputer.SetPrinter(epsonPrinter)macComputer.Print()fmt.Println()winComputer := &Windows{}winComputer.SetPrinter(hpPrinter)winComputer.Print()fmt.Println()winComputer.SetPrinter(epsonPrinter)winComputer.Print()fmt.Println()
}

output:

Print request for mac
Printing by a HP PrinterPrint request for mac
Printing by a EPSON PrinterPrint request for windows
Printing by a HP PrinterPrint request for windows
Printing by a EPSON Printer

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

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

相關文章

GitHub的使用教程

第一章:準備工作 1.1:安裝Git并設置你的GitHub賬戶 1.1.1:注冊 GitHub 賬號: 訪問 https://github.com/ 并注冊一個新賬號。 可以使用qq郵箱進行注冊 輸入郵箱后點擊sign up for GitHub,設置密碼后進行注冊,輸入驗…

Day56 Java面向對象10 方法重寫

Day56 Java面向對象10 方法重寫 1.為什么要方法重寫 當子類不需要父類方法的全部內容 或 父類的方法無法滿足子類的需求時,就需要在子類重寫父類的方法 2.如何方法重寫 重寫必須發生在繼承關系中,只能是子類重寫父類子類重寫的方法名必須和父類方法一致,方法體可以不同子類重寫…

【C++】標準庫中用于組合多個值的數據結構pair、tuple、array...

在 C 標準庫中,有多種數據結構可用于組合多個值,每種結構都有其特定的設計目的和適用場景。以下是主要組合數據結構的分類解析: 一、核心組合數據結構 1. std::pair (C98) 用途:存儲兩個相關值(鍵值對、坐標點等&#…

深入解析C++ STL鏈表(List)模擬實現

目錄 一、需要實現的三個類及其成員函數接口 二、結點類的模擬實現 構造函數 三、迭代器類的模擬實現 1、迭代器類的作用 2、迭代器類模板參數說明 3、構造函數 4、前置運算符重載 5、后置運算符重載 6、前置 -- 運算符重載 7、后置 -- 運算符重載 8、運算符重載 …

將mysql數據庫表結構導出成DBML格式

前言 DBML(數據庫標記語言)是一種簡單易讀的 DSL 語言,用于定義數據庫結構。 因為需要分析商品模塊的表設計是否合理,所以需要圖形化表,并顯示表之前的關系。 想來想去,找到了DBML。所以就需要將數據庫結構…

玩轉tokenizer

🌟 案例 1:加載現成的 BERT 分詞器from tokenizers import Tokenizer# 加載一個預訓練的 BERT tokenizer(文件需要提前下載,比如bert-base-uncased) tokenizer Tokenizer.from_file("bert-base-uncased-tokenize…

Day53--圖論--106. 島嶼的周長(卡碼網),110. 字符串接龍(卡碼網),105. 有向圖的完全聯通(卡碼網)

Day53–圖論–106. 島嶼的周長(卡碼網),110. 字符串接龍(卡碼網),105. 有向圖的完全聯通(卡碼網) 106. 島嶼的周長(卡碼網) 方法:深搜 思路&am…

Elasticsearch 數據建模與映射(Mapping)詳解

在 Elasticsearch 中,數據建模與映射(Mapping) 是決定搜索性能、存儲效率和功能支持的核心環節。合理的映射設計能讓搜索更精準、聚合更高效、存儲更節省。 本文將全面詳解 Elasticsearch 的 數據建模原則、字段類型、動態映射、自定義分析器…

5G工業一體機汽車零部件工廠的無紙化管理

在全球數字化轉型的浪潮中,制造業對信息化、智能化的需求日益強烈。尤其是在汽車零部件領域,生產線的復雜性、質量追溯的苛刻性以及對效率的高要求,迫切需要一種高效、可靠、可擴展的管理模式。以“5G工業一體機”為核心的無紙化管理&#xf…

項目管理工具

1、概述IT 項目生命周期通常可分為啟動、規劃、執行、監控與控制、收尾五個核心階段,每個階段的目標和任務不同,所依賴的工具也各有側重。以下按階段梳理常用工具,涵蓋項目管理、協作、技術開發等多個維度。2、啟動階段:明確項目目…

Linux 進程、線程與 exec/系統調用詳解

1. wait 與 waitpid —— 子進程資源回收1.1 waitpid_t wait(int *wstatus);功能:阻塞等待,回收任意子進程的資源空間。參數:wstatus:保存子進程退出狀態的變量地址NULL:不保存退出狀態返回值:成功&#xf…

Laravel 使用ssh鏈接遠程數據庫

1.創建ssh ssh -i ./id_rsa -N -L 13306:127.0.0.1:3306 -p 22 root***對上述代碼的解釋: 命令是一個SSH隧道命令,用于將本地端口3306轉發到遠程服務器上的3306端口。以下是命令的詳細解釋:# 調用SSH客戶端。 ssh # 指定用于身份驗證的私鑰文…

Python延申內容(一)

1.技術面試題 (1)TCP與UDP的區別是什么? 答: TCP(傳輸控制協議):面向連接、可靠傳輸(數據完整有序)、流量控制、擁塞控制,適用于文件傳輸、網頁瀏覽等場景。 …

Java 9 新特性及具體應用

目錄 1. 模塊系統(Jigsaw) 2. JShell(REPL工具) 3. 集合工廠方法 4. 接口私有方法 5. Stream API 增強 6. HTTP/2 客戶端(Incubator) 7. 多版本JAR包 總結 1. 模塊系統(Jigsaw&#xff0…

第二十五天:構造函數/析構函數/拷貝構造

構造函數/析構函數/拷貝構造 1. 構造函數(Constructor) 定義與作用:構造函數是一種特殊的成員函數,其名稱與類名相同,沒有返回類型(包括 void 也沒有)。它的主要作用是在創建對象時初始化對象的…

【P14 3-6 】OpenCV Python——視頻加載、攝像頭調用、視頻基本信息獲取(寬、高、幀率、總幀數),視頻保存在指定位置

文章目錄1 讀取本地視頻1.1 絕對路徑 6種方式1.2 相對路徑 4種方式1.3 讀取本地視頻2 視頻基本信息3 調用攝像頭 并將視頻保存在指定位置P14 3-6 1 讀取本地視頻 現在要讀取本地視頻“video.mp4”, 視頻文件“video.mp4”和playVideo.py腳本文件,都在…

【DL學習筆記】常用數據集總結

一、如何找數據集 paperswithcode,但好像沒了 AutoDL Roboflow Kaggle Hungging Face 百度飛漿PP AIStudio 二、目標檢測數據集格式 常用數據集坐標格式 MSCOCO : 坐標格式(x,y,w,h&#xff…

19.3 Transformers量化模型極速加載指南:4倍推理加速+75%顯存節省實戰

Transformers量化模型極速加載指南:4倍推理加速+75%顯存節省實戰 實戰項目:模型量化 Transformers 兼容性配置 量化模型加載核心配置邏輯 #mermaid-svg-rDjfMigtxckLYWp3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

Android 終端接入 GB28181 國標視頻平臺的完整解決方案解析

1. 引言:讓 Android 終端無縫融入國標視頻網絡在公安、交通、應急、工業、教育等領域,GB/T 28181 國標協議早已成為視頻監控與指揮調度的事實標準。傳統國標視頻網絡通常由固定部署的 IPC 攝像機、NVR、視頻管理平臺構成,設備形態單一。隨著一…

Docker目錄的遷移

# 遷移 docker 目錄 (無論容器與鏡像占用空間大小,哪怕只占用1G,也需用此方式,否則可能遷移不成功)service docker stopcd /var/lib/docker# 一個一個復制除 overlay2 外的其他所有文件夾cp -R builder /home/docker/l…