【設(shè)計(jì)模式】如何通過(guò)橋接模式解決系統(tǒng)擴(kuò)展難題?
概述
現(xiàn)在有一個(gè)需求,需要?jiǎng)?chuàng)建不同的圖形,并且每個(gè)圖形都有可能會(huì)有不同的顏色。我們可以利用繼承的方式來(lái)設(shè)計(jì)類(lèi)的關(guān)系:

我們可以發(fā)現(xiàn)有很多的類(lèi),假如我們?cè)僭黾右粋€(gè)形狀或再增加一種顏色,就需要?jiǎng)?chuàng)建更多的類(lèi)。
試想,在一個(gè)有多種可能會(huì)變化的維度的系統(tǒng)中,用繼承方式會(huì)造成類(lèi)爆炸,擴(kuò)展起來(lái)不靈活。每次在一個(gè)維度上新增一個(gè)具體實(shí)現(xiàn)都要增加多個(gè)子類(lèi)。為了更加靈活的設(shè)計(jì)系統(tǒng),我們此時(shí)可以考慮使用橋接模式。
定義:將抽象與實(shí)現(xiàn)分離,使它們可以獨(dú)立變化。它是用組合關(guān)系代替繼承關(guān)系來(lái)實(shí)現(xiàn),從而降低了抽象和實(shí)現(xiàn)這兩個(gè)可變維度的耦合度。
結(jié)構(gòu)
橋接(Bridge)模式包含以下主要角色:
-
抽象化(Abstraction)角色 :定義抽象類(lèi),并包含一個(gè)對(duì)實(shí)現(xiàn)化對(duì)象的引用。
-
擴(kuò)展抽象化(Refined Abstraction)角色 :是抽象化角色的子類(lèi),實(shí)現(xiàn)父類(lèi)中的業(yè)務(wù)方法,并通過(guò)組合關(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)。
案例
【例】視頻播放器
需要開(kāi)發(fā)一個(gè)跨平臺(tái)視頻播放器,可以在不同操作系統(tǒng)平臺(tái)(如Windows、Mac、Linux等)上播放多種格式的視頻文件,常見(jiàn)的視頻格式包括RMVB、AVI、WMV等。該播放器包含了兩個(gè)維度,適合使用橋接模式。
類(lèi)圖如下:

代碼如下:
//視頻文件
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 OperatingSystem {
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);
}
}
//測(cè)試類(lèi)
public class Client {
public static void main(String[] args) {
OperatingSystem os = new Windows(new AVIFile());
os.play("戰(zhàn)狼3");
}
}
好處:
-
橋接模式提高了系統(tǒng)的可擴(kuò)充性,在兩個(gè)變化維度中任意擴(kuò)展一個(gè)維度,都不需要修改原有系統(tǒng)。如:如果現(xiàn)在還有一種視頻文件類(lèi)型wmv,我們只需要再定義一個(gè)類(lèi)實(shí)現(xiàn)VideoFile接口即可,其他類(lèi)不需要發(fā)生變化。
-
實(shí)現(xiàn)細(xì)節(jié)對(duì)客戶(hù)透明
使用場(chǎng)景
-
當(dāng)一個(gè)類(lèi)存在兩個(gè)獨(dú)立變化的維度,且這兩個(gè)維度都需要進(jìn)行擴(kuò)展時(shí)。
-
當(dāng)一個(gè)系統(tǒng)不希望使用繼承或因?yàn)槎鄬哟卫^承導(dǎo)致系統(tǒng)類(lèi)的個(gè)數(shù)急劇增加時(shí)。
-
當(dāng)一個(gè)系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性時(shí)。避免在兩個(gè)層次之間建立靜態(tài)的繼承聯(lián)系,通過(guò)橋接模式可以使它們?cè)诔橄髮咏⒁粋€(gè)關(guān)聯(lián)關(guān)系。
往期推薦
本文來(lái)自在線(xiàn)網(wǎng)站:seven的菜鳥(niǎo)成長(zhǎng)之路,作者:seven,轉(zhuǎn)載請(qǐng)注明原文鏈接:www.seven97.top

浙公網(wǎng)安備 33010602011771號(hào)