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




















 
 
 








 
 
 
 