【設計模式】JAVA Design Patterns——Bridge(橋接模式)

🔍目的


將抽象與其實現分離,以便二者可以獨立變化。

🔍解釋


真實世界例子

考慮一下你擁有一種具有不同附魔的武器,并且應該允許將具有不同附魔的不同武器混合使用。 你會怎么做? 為每個附魔創建每種武器的多個副本,還是只是創建單獨的附魔并根據需要為武器設置它? 橋接模式使您可以進行第二次操作

通俗描述

橋接模式是一個更推薦組合而不是繼承的模式。將實現細節從一個層次結構推送到具有單獨層次結構的另一個對象。

維基百科

橋接模式是軟件工程中使用的一種設計模式,旨在“將抽象與其實現分離,從而使兩者可以獨立變化”

程序示例

創建一個武器類層級

public interface Weapon {void wield();void swing();void unwield();Enchantment getEnchantment();
}public class Sword implements Weapon {private final Enchantment enchantment;public Sword(Enchantment enchantment) {this.enchantment = enchantment;}@Overridepublic void wield() {LOGGER.info("The sword is wielded.");enchantment.onActivate();}@Overridepublic void swing() {LOGGER.info("The sword is swinged.");enchantment.apply();}@Overridepublic void unwield() {LOGGER.info("The sword is unwielded.");enchantment.onDeactivate();}@Overridepublic Enchantment getEnchantment() {return enchantment;}
}public class Hammer implements Weapon {private final Enchantment enchantment;public Hammer(Enchantment enchantment) {this.enchantment = enchantment;}@Overridepublic void wield() {LOGGER.info("The hammer is wielded.");enchantment.onActivate();}@Overridepublic void swing() {LOGGER.info("The hammer is swinged.");enchantment.apply();}@Overridepublic void unwield() {LOGGER.info("The hammer is unwielded.");enchantment.onDeactivate();}@Overridepublic Enchantment getEnchantment() {return enchantment;}
}

創建單獨的附魔類

public interface Enchantment {void onActivate();void apply();void onDeactivate();
}public class FlyingEnchantment implements Enchantment {@Overridepublic void onActivate() {LOGGER.info("The item begins to glow faintly.");}@Overridepublic void apply() {LOGGER.info("The item flies and strikes the enemies finally returning to owner's hand.");}@Overridepublic void onDeactivate() {LOGGER.info("The item's glow fades.");}
}public class SoulEatingEnchantment implements Enchantment {@Overridepublic void onActivate() {LOGGER.info("The item spreads bloodlust.");}@Overridepublic void apply() {LOGGER.info("The item eats the soul of enemies.");}@Overridepublic void onDeactivate() {LOGGER.info("Bloodlust slowly disappears.");}
}

原神啟動!

var enchantedSword = new Sword(new SoulEatingEnchantment());
enchantedSword.wield();
enchantedSword.swing();
enchantedSword.unwield();
// The sword is wielded.
// The item spreads bloodlust.
// The sword is swinged.
// The item eats the soul of enemies.
// The sword is unwielded.
// Bloodlust slowly disappears.var hammer = new Hammer(new FlyingEnchantment());
hammer.wield();
hammer.swing();
hammer.unwield();
// The hammer is wielded.
// The item begins to glow faintly.
// The hammer is swinged.
// The item flies and strikes the enemies finally returning to owner's hand.
// The hammer is unwielded.
// The item's glow fades.

🔍類圖

Bridge class diagram?

🔍適用場景

使用橋接模式當

  • 你想永久性的避免抽象和他的實現之間的綁定。有可能是這種情況,當實現需要被選擇或者在運行時切換。
  • 抽象和他們的實現應該能通過寫子類來擴展。這種情況下,橋接模式讓你可以組合不同的抽象和實現并獨立的擴展他們。
  • 對抽象的實現的改動應當不會對客戶產生影響;也就是說,他們的代碼不必重新編譯。
  • 你有種類繁多的類。這樣的類層次結構表明需要將一個對象分為兩部分。Rumbaugh 使用術語“嵌套歸納”來指代這種類層次結構。
  • 你想在多個對象間分享一種實現(可能使用引用計數),這個事實應該對客戶隱藏。一個簡單的示例是Coplien的String類,其中多個對象可以共享同一字符串表示形式


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

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

相關文章

當代人工智能三教父——深度學習三巨頭

文章目錄 引言 人物介紹 突出貢獻 專業名詞解釋 引言 今天下午閑來無事翻閱了一下csdn首頁的頭條文章——《27 歲天才創始人 Joel Hellermark 分享了自己和“AI 教父” Geoffery Hinton 的最新采訪》 感覺挺有意思,就從頭到尾的看了一遍,里面有很多…

pyqt5與yolov5進行視頻檢測(一)——登錄操作

項目效果展示 一、登錄界面 二、主界面 目前在更新中。。。 一、設計 二、登錄代碼 注意:下面會導入主界面的包,圖片資源自己設計一下,密碼保存時沒設計加密,需要自行設計 main_window主界面下文會設計from main_window impor…

無線通信的穿墻能力主要取決于哪些指標

無線通信的穿墻能力是指無線信號在穿越建筑物墻壁時,其信號衰減程度以及能否維持足夠強度以進行穩定通信的能力。穿墻能力的好壞直接影響到無線通信在室內環境中的覆蓋范圍和使用體驗。 一、無線信號的頻率 無線信號的頻率是影響穿墻能力的重要因素之一。一般來說…

工行音視頻服務平臺建設與應用經驗

近些年來,伴隨著技術能力的積累突破,音視頻服務開始蓬勃生長走進千家萬戶,使用遠程視頻通話、觀看各類視頻直播逐漸成為人們的日常,而金融服務作為社會生活的重要組成部分,自然需要積極擁抱應用新技術。 如今&#xff…

怎么知道Python包的依賴項

要查看Python包的依賴項,有幾種方法可以做到這一點: 使用pip: pip是Python的包管理器,它允許你安裝和管理Python庫。要查看一個包的依賴關系,你可以使用pip show命令加上包名,但請注意,直接用pip show并不直接列出依賴項,它提供包的詳細信息,包括它的安裝路徑。為了查看…

Kubernetes Deployment 之擴縮容與滾動更新

Kubernetes Deployment 之擴縮容與滾動更新 Deployment 擴縮容 擴縮容非常簡單,我們可以直接調整 replica 副本數目,然后 kubectl apply指定進行動態更新。下面將nginx-deployment動態改為 1 個 Pod 和 3 個 Pod 的操作 apiVersion: apps/v1 kind: De…

20232820 2023-2024-2 《網絡攻防實踐》實踐十一報告

20232820 2023-2024-2 《網絡攻防實踐》實踐十一報告 1.實踐內容 web瀏覽器滲透攻擊 任務:使用攻擊機和Windows靶機進行瀏覽器滲透攻擊實驗,體驗網頁木馬構造及實施瀏覽器攻擊的實際過程 取證分析實踐—網頁木馬攻擊場景分析 攻防對抗實踐—web瀏覽…

非關系型數據庫NOSQL

文章目錄 1. NOSQL 概述2. 相關理論基礎2.1 一致性2.2 分區2.3 存儲分布2.4 查詢模型 3. NOSQL 數據庫的種類3.1 文檔存儲3.2 鍵值存儲3.3 列存儲3.3 圖存儲 4. NOSQL 應用案例和新技術4.1 HBase 數據庫4.2 云數據庫 GeminiDB 非關系型的數據庫 NOSQL (Not Only SQL)是對不同于…

linux-x86_64-musl 里面的musl是什么意思?

在一些開源庫里面可以看到,linux-x86_64-musl類似于這樣的字符串,這個musl是什么意思呢? 在字符串 "linux-x86_64-musl" 中,musl 指的是 musl libc,這是一個輕量級的 C 標準庫實現。 讓我們來拆解一下這個字…

Linux系統(ubuntu)掛載jffs2文件系統

一. 掛載操作 1、加載mtdram模塊: sudo modprobe mtdram total_size16384//total_size后面跟的參數單位是KB,并且其大小要大于jffs2鏡像文件的大小 2、sudo modprobe mtd 3、sudo modprobe mtdblock 4、sudo modprobe jffs2 5、拷貝jffs2鏡像文件到/dev…

Unity性能優化工具介紹

文章目錄 一.Stats組件1.Audio音頻的數據組件:2.圖形數據 二.Profiler 性能分析器 一.Stats組件 Unity自帶Statistics(統計數據),Game視窗中點擊Stats打開 1.Audio音頻的數據組件: 1):Level 聲音強度 單位是分貝(dB) 表示音頻聽聲音的大小,是閃爍波動的. 2):SDPload 數據信…

閱讀筆記——《AFLNeTrans:狀態間關系感知的網絡協議模糊測試》

【參考文獻】洪玄泉,賈鵬,劉嘉勇.AFLNeTrans:狀態間關系感知的網絡協議模糊測試[J].信息網絡安全,2024,24(01):121-132.【注】本文僅為作者個人學習筆記,如有冒犯,請聯系作者刪除。 目錄 摘要 1、引言 2、背景及動機 2.1、網絡協議實現程…

每日AIGC最新進展(9):定制化多主題文本到視頻的生成、3D動漫角色生成、具有多種幾何形狀和紋理細節的3D高斯引導服裝合成

Diffusion Models專欄文章匯總:入門與實戰 DisenStudio: Customized Multi-subject Text-to-Video Generation with Disentangled Spatial Control 本文提出了一個名為DisenStudio的框架,用于定制化多主題文本到視頻的生成。該框架旨在解決現有文本到視頻生成模型在處理多主題…

UE5文件操作

首先在虛幻引擎中創建UMyBlueprintFunctionLibrary類,可以在該類中寫我們重復利用的功能,并且這些功能不依賴于特定的游戲對象,方便全局調用。 1.文件的讀取和寫入 UFUNCTION(BlueprintCallable, Category "File")static bool lo…

C++小病毒

C小病毒&#xff08;注&#xff1a;對電腦無過大傷害&#xff09; 短短行&#xff0c;創造奇跡&#xff01; 把這個文件命名為virus.exe就可以使用了。 #include<bits/stdc.h> #include<windows.h> using namespace std; int main() {HWND hwnd GetForegroundW…

Unity射擊游戲開發教程:(24)創造不同的敵人

在這篇文章中,我們將討論添加一個可以承受多次攻擊的新敵人和一些動畫來使事情變得栩栩如生。敵人沒有任何移動或射擊行為。這將有助于增強未來敵人的力量。 我們將聲明一個 int 來存儲敵人可以承受的攻擊數量,并將其設置為 3。

PDF24 Creator v11.12.1軟件安裝教程(附軟件下載地址)

軟件簡介&#xff1a; 軟件【下載地址】獲取方式見文末。注&#xff1a;推薦使用&#xff0c;更貼合此安裝方法&#xff01; PDF24 Creator v11.12.1是一款免費、簡便實用的多功能 PDF 工具。用戶可通過直觀拖放界面輕松組合、編輯和處理PDF文件。功能包括合并、分割、添加、…

C# 觀察者模式實現

代碼&#xff1a; using System; using System.Collections.Generic;public delegate void NotificationObserverCallback(object obj);public class NotificationObserver {public NotificationObserverCallback Selector null;public string KeyName ""; }public…

Java開發工具類(JDK、Hutool、Guava)

目錄 Java開發常用的工具類1、JDK自帶程序讀取控制臺輸入內容&#xff08;調試程序或者學習的時候比較有用&#xff09;Arrays工具類 數組轉集合Collections 集合工具類 排序Collections 集合工具類 查找Lambda表達式 操作集合 收集、轉map、分組 2、Apache 的 commons-lang3 和…

一文解讀:OA中會議管理功能,幫助設計師看清楚門道

會議管理是OA系統中的重要功能之一&#xff0c;它涉及到會議的組織、安排、記錄和跟進等方面。本文將從以下四個方面介紹會議管理在OA系統中的功能、流程、設計注意事項和所涉界面。 一、OA中會議管理的功能 OA中常用的會議功能如下&#xff1a; 會議預約&#xff1a;OA系統提…