提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔> 學(xué)習(xí)的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾。各位小伙伴,如果您:
想系統(tǒng)/深入學(xué)習(xí)某技術(shù)知識點(diǎn)…
一個人摸索學(xué)習(xí)很難堅持,想組團(tuán)高效學(xué)習(xí)…
想寫博客但無從下手,急需寫作干貨注入能量…
熱愛寫作,愿意讓自己成為更好的人…
一、概述
現(xiàn)在有一個需求,需要創(chuàng)建不同的圖形,并且每個圖形都有可能會有不同的顏色。我們可以利用繼承的方式來設(shè)計類的關(guān)系:
我們可以發(fā)現(xiàn)有很多的類,假如我們再增加一個形狀或再增加一種顏色,就需要創(chuàng)建更多的類。
試想,在一個有多種可能會變化的維度的系統(tǒng)中,用繼承方式會造成類爆炸,擴(kuò)展起來不靈活。每次在一個維度上新增一個具體實(shí)現(xiàn)都要增加多個子類。為了更加靈活的設(shè)計系統(tǒng),我們此時可以考慮使用橋接模式。
定義:
? 將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來實(shí)現(xiàn),從而降低了抽象和實(shí)現(xiàn)這兩個可變維度的耦合度。
二、結(jié)構(gòu)
橋接(Bridge)模式包含以下主要角色:
- 抽象化(Abstraction)角色 :定義抽象類,并包含一個對實(shí)現(xiàn)化對象的引用。
- 擴(kuò)展抽象化(Refined Abstraction)角色 :是抽象化角色的子類,實(shí)現(xiàn)父類中的業(yè)務(wù)方法,并通過組合關(guān)系調(diào)用實(shí)現(xiàn)化角色中的業(yè)務(wù)方法。
- 實(shí)現(xiàn)化(Implementor)角色 :定義實(shí)現(xiàn)化角色的接口,供擴(kuò)展抽象化角色調(diào)用。
- 具體實(shí)現(xiàn)化(Concrete Implementor)角色 :給出實(shí)現(xiàn)化角色接口的具體實(shí)現(xiàn)。
三、案例
【例】視頻播放器
需要開發(fā)一個跨平臺視頻播放器,可以在不同操作系統(tǒng)平臺(如Windows、Mac、Linux等)上播放多種格式的視頻文件,常見的視頻格式包括RMVB、AVI、WMV等。該播放器包含了兩個維度,適合使用橋接模式。
類圖如下:
代碼如下:
//視頻文件
public interface VideoFile {
void decode(String fileName);
}
//avi文件
public class AVIFile implements VideoFile {
public void decode(String fileName) {
System.out.println("avi視頻文件:"+ fileName);
}
}
//rmvb文件
public class REVBBFile implements VideoFile {
public void decode(String fileName) {
System.out.println("rmvb文件:" + fileName);
}
}
//操作系統(tǒng)版本
public abstract class OperatingSystemVersion {
protected VideoFile videoFile;
public OperatingSystemVersion(VideoFile videoFile) {
this.videoFile = videoFile;
}
public abstract void play(String fileName);
}
//Windows版本
public class Windows extends OperatingSystemVersion {
public Windows(VideoFile videoFile) {
super(videoFile);
}
public void play(String fileName) {
videoFile.decode(fileName);
}
}
//mac版本
public class Mac extends OperatingSystemVersion {
public Mac(VideoFile videoFile) {
super(videoFile);
}
public void play(String fileName) {
videoFile.decode(fileName);
}
}
//測試類
public class Client {
public static void main(String[] args) {
//創(chuàng)建Windows系統(tǒng)對象
OperatingSystemVersion os = new Windows(new AVIFile());
//使用操作系統(tǒng)播放視頻文件
os.play("戰(zhàn)狼3");
//創(chuàng)建MAC系統(tǒng)對象
OperatingSystemVersion os1 = new Mac(new REVBBFile());
//使用操作系統(tǒng)播放視頻文件
os1.play("戰(zhàn)狼2");
}
}
好處:
-
橋接模式提高了系統(tǒng)的可擴(kuò)充性,在兩個變化維度中任意擴(kuò)展一個維度,都不需要修改原有系統(tǒng)。
如:如果現(xiàn)在還有一種視頻文件類型wmv,我們只需要再定義一個類實(shí)現(xiàn)VideoFile接口即可,其他類不需要發(fā)生變化。
-
實(shí)現(xiàn)細(xì)節(jié)對客戶透明文章來源:http://www.zghlxwxcb.cn/news/detail-822292.html
四、使用場景
- 當(dāng)一個類存在兩個獨(dú)立變化的維度,且這兩個維度都需要進(jìn)行擴(kuò)展時。
- 當(dāng)一個系統(tǒng)不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類的個數(shù)急劇增加時。
- 當(dāng)一個系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性時。避免在兩個層次之間建立靜態(tài)的繼承聯(lián)系,通過橋接模式可以使它們在抽象層建立一個關(guān)聯(lián)關(guān)系。
總結(jié)
以上就是設(shè)計模式之橋接模式【結(jié)構(gòu)型模式】的相關(guān)知識點(diǎn),希望對你有所幫助。
積跬步以至千里,積怠惰以至深淵。時代在這跟著你一起努力哦!文章來源地址http://www.zghlxwxcb.cn/news/detail-822292.html
到了這里,關(guān)于設(shè)計模式之橋接模式【結(jié)構(gòu)型模式】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!