?作者簡介:大家好,我是 Meteors., 向往著更加簡潔高效的代碼寫法與編程方式,持續分享Java技術內容。
🍎個人主頁:Meteors.的博客
💞當前專欄:設計模式
?特色專欄:知識分享
🥭本文內容:23種設計模式——橋接模式 (Bridge Pattern)
📚 ** ps **? :閱讀文章如果有問題或者疑惑,歡迎在評論區提問或指出。
目錄
一. 背景
二. 介紹
三.?模式結構
四. 代碼示例
五. 使用橋接模式的原因
六.??橋接模式的優缺點
1. 優點
2. 缺點:
七. 適用場景
八.?與其他模式的區別
九.?實際應用場景
十. 總結
一. 背景
橋接模式......不僅僅名字聽著陌生,在看一些比較復雜的示例代碼的時候也是一臉懵。后來仔細看看,終于有了思路——橋接模式其實就是把代碼中需要變的地方換成抽象或者接口,并把它作為參數傳入即可。橋接模式有兩個地方要變(抽象與實現),于是代碼就有兩個地方用接口或者抽象!
二. 介紹
橋接模式是一種結構型設計模式,它將抽象部分與實現部分分離,使它們可以獨立變化。橋接模式通過組合關系代替繼承關系,從而降低抽象和實現這兩個可變維度的耦合度。
三.?模式結構
橋接模式包含以下主要角色:
- 抽象化(Abstraction)??:定義抽象接口,維護對實現化對象的引用
- 擴展抽象化(Refined Abstraction)??:擴展抽象化定義的接口
- 實現化(Implementor)??:定義實現類的接口
- 具體實現化(Concrete Implementor)??:實現實現化接口
四. 代碼示例
實現一個圖形繪制系統,支持多種形狀和多種顏色(形狀和顏色要可擴展)。
實現代碼:
// 實現化接口:顏色 interface Color {void applyColor(); }// 具體實現化:紅色 class Red implements Color {@Overridepublic void applyColor() {System.out.println("應用紅色");} }// 具體實現化:藍色 class Blue implements Color {@Overridepublic void applyColor() {System.out.println("應用藍色");} }// 抽象化:形狀 abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}abstract void draw(); }// 擴展抽象化:圓形 class Circle extends Shape {public Circle(Color color) {super(color);}@Overridevoid draw() {System.out.print("繪制圓形,");color.applyColor();} }// 擴展抽象化:方形 class Square extends Shape {public Square(Color color) {super(color);}@Overridevoid draw() {System.out.print("繪制方形,");color.applyColor();} }// 客戶端代碼 public class BridgePatternDemo {public static void main(String[] args) {// 創建紅色圓形Shape redCircle = new Circle(new Red());redCircle.draw();// 創建藍色方形Shape blueSquare = new Square(new Blue());blueSquare.draw();// 創建藍色圓形Shape blueCircle = new Circle(new Blue());blueCircle.draw();} }
通過上面的實現,我們就可以進一步擴展系統,比如添加更多形狀(三角形)或顏色(綠色)而不影響現有代碼。
五. 使用橋接模式的原因
通過上面的案例,我們就很好理解使用橋接模式的原因了:
解耦抽象和實現:將抽象部分和實現部分分離,使它們可以獨立變化
提高可擴展性:可以獨立地擴展抽象部分和實現部分
符合開閉原則:對擴展開放,對修改關閉
隱藏實現細節:客戶端不需要知道實現的細節
六.??橋接模式的優缺點
1. 優點
分離接口和實現:抽象和實現可以獨立擴展
提高可擴展性:可以獨立地擴展抽象部分和實現部分
符合開閉原則:對擴展開放,對修改關閉
隱藏實現細節:客戶端不需要知道實現的細節
減少子類數量:避免了多重繼承導致的類爆炸問題
2. 缺點:
增加系統復雜度:需要正確識別出系統中兩個獨立變化的維度
設計難度增加:需要預先識別出系統中的抽象和實現部分
七. 適用場景
- 不希望在抽象和實現部分之間有固定的綁定關系:比如在程序運行時實現部分應可以被子類化
- 類的抽象以及其實現都應該可以通過生成子類的方法加以擴充
- 對一個抽象的實現部分的修改應對客戶不產生影響
- 想在多個對象間共享實現,但同時要求客戶并不知道
- 想通過繼承或組合方式,在多個抽象和實現之間進行組合
八.?與其他模式的區別
- 與適配器模式:適配器模式是后期為了兼容而做的補救措施,橋接模式是前期設計時的架構選擇
- 與裝飾器模式:裝飾器模式是為了增加功能,橋接模式是為了分離抽象和實現
- 與策略模式:策略模式關注算法的替換,橋接模式關注抽象和實現的分離
九.?實際應用場景
圖形渲染系統:不同的圖形(圓形、矩形)可以在不同的平臺(Windows、Linux)上渲染
數據庫驅動:同一套數據庫操作接口可以適配不同的數據庫(MySQL、Oracle、PostgreSQL)
消息發送系統:不同類型的消息(郵件、短信)可以通過不同的渠道(郵件服務器、短信網關)發送
游戲開發:不同的游戲角色可以在不同的平臺上運行
十. 總結
橋接模式是一種非常有用的結構型設計模式,它通過將抽象部分與實現部分分離,使它們可以獨立變化。這種模式特別適用于需要在多個維度上擴展的系統,能夠有效避免類的爆炸性增長,提高系統的靈活性和可維護性。
在實際開發中,當我們發現系統中存在多個變化維度,且這些維度需要獨立變化時,就可以考慮使用橋接模式。通過合理運用橋接模式,可以讓我們的代碼更加靈活、可擴展,并且符合面向對象設計原則。
最后,
? ? ? ? 其它設計模式會陸續更新,希望文章對你有所幫助!