什么是橋接模式?你可能還不知道
- 1. 橋接模式概述
- 2. 橋接模式的結構與實現
- 3. 橋接模式的應用實例
- 4. 橋接模式與適配器模式的聯用
- 5. 橋接模式的優缺點與適用環境
“Github:https://github.com/nateshao/design-demo/tree/main/JavaDesignPatterns/10-bridge
1. 橋接模式概述
定義
“橋接模式:將抽象部分與它的實現部分解耦,使得兩者都能夠獨立變化。
對象結構型模式
- 又被稱為柄體(Handle and Body)模式或接口(Interface)模式
- 用抽象關聯取代了傳統的多層繼承
- 將類之間的靜態繼承關系轉換為動態的對象組合關系
橋接模式的結構
橋接模式包含以下4個角色:
- Abstraction(抽象類)
- RefinedAbstraction(擴充抽象類)
- Implementor(實現類接口)
- ConcreteImplementor(具體實現類)
2. 橋接模式的結構與實現
典型的實現類接口代碼:
- public interface Implementor {
- public void operationImpl();
- }
典型的具體實現類代碼:
- public class ConcreteImplementor implements Implementor {
- public void operationImpl() {
- //具體業務方法的實現
- }
- }
典型的具體實現類代碼:
- public abstract class Abstraction {
- protected Implementor impl; //定義實現類接口對象
- public void setImpl(Implementor impl) {
- this.impl=impl;
- }
- public abstract void operation(); //聲明抽象業務方法
- }
典型的 擴充抽象類(細化抽象類) 代碼:
- public class RefinedAbstraction extends Abstraction {
- public void operation() {
- //業務代碼
- impl.operationImpl(); //調用實現類的方法
- //業務代碼
- }
- }
3. 橋接模式的應用實例
“實例說明:某軟件公司要開發一個跨平臺圖像瀏覽系統,要求該系統能夠顯示BMP、JPG、GIF、PNG等多種格式的文件,并且能夠在Windows、Linux、UNIX等多個操作系統上運行。系統首先將各種格式的文件解析為像素矩陣(Matrix),然后將像素矩陣顯示在屏幕上,在不同的操作系統中可以調用不同的繪制函數來繪制像素矩陣。另外,系統需具有較好的擴展性,以便在將來支持新的文件格式和操作系統。試使用橋接模式設計該跨平臺圖像瀏覽系統。
實例類圖:
跨平臺圖像瀏覽系統結構圖
實例代碼
- Matrix:像素矩陣類,輔助類
- ImageImp:抽象操作系統實現類,充當實現類接口
- WindowsImp:Windows操作系統實現類,充當具體實現類
- LinuxImp:Linux操作系統實現類,充當具體實現類
- UnixImp:UNIX操作系統實現類,充當具體實現類
- Image:抽象圖像類,充當抽象類
- JPGImage:JPG格式圖像類,充當擴充抽象類
- PNGImage:PNG格式圖像類,充當擴充抽象類
- BMPImage:BMP格式圖像類,充當擴充抽象類
- GIFImage:GIF格式圖像類,充當擴充抽象類
- Client:客戶端測試類
“結果及分析:如果需要更換圖像文件格式或者更換操作系統,只需修改配置文件即可
- <?xml version="1.0"?>
- <config>
- <!--RefinedAbstraction-->
- <className>designpatterns.bridge.JPGImage</className>
- <!--ConcreteImplementor-->
- <className>designpatterns.bridge.WindowsImp</className>
- </config>
4. 橋接模式與適配器模式的聯用
橋接模式:用于系統的初步設計,對于存在兩個獨立變化維度的類可以將其分為抽象化和實現化兩個角色,使它們可以分別進行變化
適配器模式:當發現系統與已有類無法協同工作時
橋接模式與適配器模式聯用示意圖
5. 橋接模式的優缺點與適用環境
模式優點
- 分離抽象接口及其實現部分
- 可以取代多層繼承方案,極大地減少了子類的個數
- 提高了系統的可擴展性,在兩個變化維度中任意擴展一個維度,不需要修改原有系統,符合開閉原則
模式缺點
- 會增加系統的理解與設計難度,由于關聯關系建立在抽象層,要求開發者一開始就針對抽象層進行設計與編程
- 正確識別出系統中兩個獨立變化的維度并不是一件容易的事情
模式適用環境
需要在抽象化和具體化之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承關系
抽象部分和實現部分可以以繼承的方式獨立擴展而互不影響
一個類存在兩個(或多個)獨立變化的維度,且這兩個(或多個)維度都需要獨立地進行擴展
不希望使用繼承或因為多層繼承導致系統類的個數急劇增加的系統