日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java设计模式-桥接模式 理论代码相结合

發(fā)布時間:2025/3/19 java 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java设计模式-桥接模式 理论代码相结合 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

繼Java設(shè)計模式-裝飾器模式后的橋接模式出來了,感興趣的話,就來看一看吧。
會了就當(dāng)復(fù)習(xí)丫,不會來一起來看看吧。
很喜歡一句話:“八小時內(nèi)謀生活,八小時外謀發(fā)展”。
如果你也喜歡,讓我們一起堅持吧!!
共勉😁


校園一角

Java設(shè)計模式-橋接模式 理論代碼相結(jié)合

    • 一、橋接模式介紹
      • 1)引入
      • 2)概述
      • 3)模式結(jié)構(gòu)
      • 4)使用場景
    • 二、橋接模式案例
      • 2.1、案例
      • 2.2、代碼實現(xiàn)
    • 三、總結(jié)
      • 優(yōu)缺點:
      • 注意事項
    • 四、自言自語

一、橋接模式介紹

1)引入

? 在現(xiàn)實生活中,某些類具有兩個或多個維度的變化,如圖形既可按形狀分,又可按顏色分。如何設(shè)計類似于 Photoshop 這樣的軟件,能畫不同形狀和不同顏色的圖形呢?如果用繼承方式,m 種形狀和 n 種顏色的圖形就有 m×n 種,不但對應(yīng)的子類很多,而且擴(kuò)展困難。

? 在軟件系統(tǒng)中,某些類型由于自身的邏輯,它具有兩個或多個維度的變化,那么如何應(yīng)對這種“多維度的變化”?如何利用面向?qū)ο蟮募夹g(shù)來使得該類型能夠輕松的沿著多個方向進(jìn)行變化,而又不引入額外的復(fù)雜度?這就要使用Bridge模式。(當(dāng)然并不局限于橋接模式)

2)概述

橋接模式:將抽象部分與實現(xiàn)部分分離,使它們可以獨立變化。它是用組合關(guān)系代替繼承關(guān)系來實現(xiàn),從而降低了抽象和實現(xiàn)這兩個可變維度的耦合度。

橋接模式將繼承關(guān)系轉(zhuǎn)化成關(guān)聯(lián)關(guān)系,它降低了類與類之間的耦合度,減少了系統(tǒng)中類的數(shù)量,也減少了代碼量

將抽象部分與他的實現(xiàn)部分分離這句話不是很好理解,其實這并不是將抽象類與他的派生類分離,而是抽象類和它的派生類用來實現(xiàn)自己的對象。這樣還是不能理解的話。我們就先來認(rèn)清什么是抽象化,什么是實現(xiàn)化,什么是脫耦

抽象化:存在于多個實體中的共同的概念性聯(lián)系,就是抽象化。作為一個過程,抽象化就是忽略一些信息,從而把不同的實體當(dāng)做同樣的實體對待。

實現(xiàn)化:抽象化給出的具體實現(xiàn),就是實現(xiàn)化

脫耦:所謂耦合,就是兩個實體的行為的某種強(qiáng)關(guān)聯(lián)。而將它們的強(qiáng)關(guān)聯(lián)去掉,就是耦合的解脫,或稱脫耦。在這里,脫耦是指將抽象化和實現(xiàn)化之間的耦合解脫開,或者說是將它們之間的強(qiáng)關(guān)聯(lián)改換成弱關(guān)聯(lián)。

兩個角色之間的繼承關(guān)系改為聚合關(guān)系,就是將它們之間的強(qiáng)關(guān)聯(lián)改換成為弱關(guān)聯(lián)。因此,橋梁模式中的所謂脫耦,就是指在一個軟件系統(tǒng)的抽象化和實現(xiàn)化之間使用組合/聚合關(guān)系而不是繼承關(guān)系,從而使兩者可以相對獨立地變化。這就是橋梁模式的用意。

3)模式結(jié)構(gòu)

由抽象化角色和修正抽象化角色組成的抽象化等級結(jié)構(gòu)。

由實現(xiàn)化角色和兩個具體實現(xiàn)化角色所組成的實現(xiàn)化等級結(jié)構(gòu)。

抽象化 (Abstraction)角色:抽象化給出的定義,并保存一個對實現(xiàn)化對象的引用。

擴(kuò)展抽象化(Refined Abstraction)角色:擴(kuò)展抽象化角色,改變和修正父類對抽象化的定義。

實現(xiàn)化(Implementor)角色:這個角色給出實現(xiàn)化角色的接口,但不給出具體的實現(xiàn)。必須指出的是,這個接口不一定和抽象化角色的接口定義相同,實際上,這兩個接口可以非常不一樣。實現(xiàn)化角色應(yīng)當(dāng)只給出底層操作,而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層的操作。

具體實現(xiàn)化(Concrete Implementor)角色:這個角色給出實現(xiàn)化角色接口的具體實現(xiàn)。

4)使用場景

  • 不希望或不適用使用繼承的場景
  • 接口或抽象類不穩(wěn)定的場景
  • 重用性要求較高的場景

二、橋接模式案例

2.1、案例

下面我們舉一個例子:

需要開發(fā)一個跨平臺視頻播放器,可以在不同操作系統(tǒng)平臺(如Windows、Mac、Linux等)上播放多種格式的視頻文件,常見的視頻格式包括RMVB、AVI、WMV等。

該播放器包含了兩個維度,適合使用橋接模式。橋接模式的核心意圖就是把這些實現(xiàn)獨立出來,讓它們各自地變化,這就使得每種實現(xiàn)的變化不會影響其他實現(xiàn),從而達(dá)到應(yīng)對變化的目的。

圖解:

從上面這個圖可以看出,

兩個維度分別為:

  • OperatingSystem就是抽象化角色,Windows和Mac是擴(kuò)展化角色,
  • VideoFile就是實現(xiàn)化角色,AVIFile和RMVBFile是具體實現(xiàn)化角色。
  • 我都懂的,還是看下面👇代碼的實現(xiàn)是咋樣的吧😁

    2.2、代碼實現(xiàn)

    OperatingSystem:

    public abstract class OperatingSystemVersion {protected VideoFile videoFile;public OperatingSystemVersion(VideoFile videoFile) {this.videoFile = videoFile;}public abstract void play(String fileName); }

    Windows和Mac是擴(kuò)展化角色

    public class Windows extends OperatingSystemVersion {public Windows(VideoFile videoFile) {super(videoFile);}public void play(String fileName) {System.out.println("Windows正在播放:");videoFile.decode(fileName);} }public class Mac extends OperatingSystemVersion {public Mac(VideoFile videoFile) {super(videoFile);}@Overridepublic void play(String fileName) {System.out.println("Mac正在播放:");videoFile.decode(fileName);} }

    VideoFile

    public interface VideoFile {void decode(String fileName); }

    AVIFile和RMVBFile是具體實現(xiàn)化角色

    public class REVBBFile implements VideoFile {public void decode(String fileName) {System.out.println("rmvb文件:" + fileName);} }public class AVIFile implements VideoFile {@Overridepublic void decode(String fileName) {System.out.println("avi視頻文件:"+ fileName);} }

    測試:

    public class Client {public static void main(String[] args) {OperatingSystemVersion os = new Mac(new AVIFile());os.play("戰(zhàn)狼3");/*** 輸出:Mac正在播放:avi視頻文件:戰(zhàn)狼3*/} }

    這么寫之后,無論是對于擴(kuò)展OperatingSystem還是VideoFile方面,都可以獨立的擴(kuò)展,非常的方便。也符合上👆文中對于橋接模式的定義:將抽象部分與實現(xiàn)部分分離,使它們可以獨立變化。它是用組合關(guān)系代替繼承關(guān)系來實現(xiàn),從而降低了抽象和實現(xiàn)這兩個可變維度的耦合度

    三、總結(jié)

    優(yōu)缺點:

    橋接(Bridge)模式的優(yōu)點是:

    • 抽象與實現(xiàn)分離,擴(kuò)展能力強(qiáng)
    • 符合開閉原則
    • 符合合成復(fù)用原則
    • 其實現(xiàn)細(xì)節(jié)對客戶透明

    缺點是:由于聚合關(guān)系建立在抽象層,要求開發(fā)者針對抽象化進(jìn)行設(shè)計與編程,能正確地識別出系統(tǒng)中兩個獨立變化的維度,這增加了系統(tǒng)的理解與設(shè)計難度。

    注意事項

    • 不要一涉及繼承就考慮該模式,盡可能把變化的因素封裝到最細(xì)、最小的邏輯單元中,避免風(fēng)險擴(kuò)散
    • 當(dāng)發(fā)現(xiàn)類的繼承有n層時,可以考慮使用該模式

    四、自言自語

    你卷我卷,大家卷,什么時候這條路才是個頭啊。😇(還是直接上天吧)

    有時候也想停下來歇一歇,一直做一個事情,感覺挺難堅持的。😁

    你好,如果你正巧看到這篇文章,并且覺得對你有益的話,就給個贊吧,讓我感受一下分享的喜悅吧,蟹蟹。🤗

    如若有寫的有誤的地方,也請大家不嗇賜教!!

    同樣如若有存在疑惑的地方,請留言或私信,定會在第一時間回復(fù)你。

    持續(xù)更新中

    與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

    總結(jié)

    以上是生活随笔為你收集整理的Java设计模式-桥接模式 理论代码相结合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。