簡(jiǎn)介
橋接模式(Bridge Pattern)是一種結(jié)構(gòu)性設(shè)計(jì)模式,它的主要作用是將抽象部分和實(shí)現(xiàn)部分解耦霹陡,使它們可以獨(dú)立變化而不會(huì)互相影響和蚪。橋接模式最早由GoF(Gang of Four)提出,在《設(shè)計(jì)模式》一書中有詳細(xì)的介紹烹棉。
橋接模式和其他設(shè)計(jì)模式的區(qū)別在于它關(guān)注的是如何將抽象和實(shí)現(xiàn)分離攒霹,從而達(dá)到靈活性和可擴(kuò)展性的目的。與之相比浆洗,適配器模式關(guān)注的是如何將不兼容的接口轉(zhuǎn)換成可兼容的接口催束,裝飾者模式關(guān)注的是如何動(dòng)態(tài)地為對(duì)象添加行為,而組合模式則是將對(duì)象組合成樹形結(jié)構(gòu)伏社,以表示“部分-整體”的層次結(jié)構(gòu)抠刺。
實(shí)現(xiàn)
假設(shè)我們正在構(gòu)建一個(gè)圖形用戶界面(GUI)框架,我們需要支持多個(gè)操作系統(tǒng)和窗口管理器摘昌。我們可以使用橋接模式來實(shí)現(xiàn)這個(gè)功能速妖。我們可以將操作系統(tǒng)和窗口管理器的實(shí)現(xiàn)分開,以便它們可以獨(dú)立地變化聪黎。我們可以定義一個(gè)抽象的Window類罕容,它有一個(gè)實(shí)現(xiàn)了WindowImpl接口的實(shí)例變量。WindowImpl接口表示窗口管理器的實(shí)現(xiàn)稿饰。我們可以定義一個(gè)操作系統(tǒng)的抽象類锦秒,它有一個(gè)實(shí)現(xiàn)了OsImpl接口的實(shí)例變量。OsImpl接口表示操作系統(tǒng)的實(shí)現(xiàn)湘纵。
下面是一個(gè)示例代碼:
interface WindowImpl {
void draw(int x, int y, int width, int height, String color);
}
class LinuxWindowImpl implements WindowImpl {
public void draw(int x, int y, int width, int height, String color) {
System.out.println("Drawing a Linux window at (" + x + ", " + y + ") with width " + width + ", height "
+ height + ", and color " + color);
}
}
class WindowsWindowImpl implements WindowImpl {
public void draw(int x, int y, int width, int height, String color) {
System.out.println("Drawing a Windows window at (" + x + ", " + y + ") with width " + width + ", height "
+ height + ", and color " + color);
}
}
abstract class Window {
private WindowImpl impl;
public Window(WindowImpl impl) {
this.impl = impl;
}
public void draw(int x, int y, int width, int height, String color) {
impl.draw(x, y, width, height, color);
}
}
abstract class Os {
private WindowImpl impl;
public Os(WindowImpl impl) {
this.impl = impl;
}
public void drawWindow(int x, int y, int width, int height, String color) {
Window window = createWindow(impl);
window.draw(x, y, width, height, color);
}
protected abstract Window createWindow(WindowImpl impl);
}
class LinuxOs extends Os {
public LinuxOs(WindowImpl impl) {
super(impl);
}
protected Window createWindow(WindowImpl impl) {
return new LinuxWindow(impl);
}
}
class WindowsOs extends Os {
public WindowsOs(WindowImpl impl) {
super(impl);
}
protected Window createWindow(WindowImpl impl) {
return new WindowsWindow(impl);
}
}
class LinuxWindow extends Window {
public LinuxWindow(WindowImpl impl) {
super(impl);
}
}
class WindowsWindow extends Window {
public WindowsWindow(WindowImpl impl) {
super(impl);
}
}
在這個(gè)例子中脂崔,WindowImpl接口表示窗口管理器的實(shí)現(xiàn),LinuxWindowImpl和WindowsWindowImpl類分別是Linux和Windows操作系統(tǒng)的窗口管理器的實(shí)現(xiàn)梧喷。Window抽象類有一個(gè)實(shí)現(xiàn)了WindowImpl接口的實(shí)例變量砌左,并且有一個(gè)draw方法脖咐,該方法將調(diào)用WindowImpl的draw方法。Os抽象類也有一個(gè)實(shí)現(xiàn)了WindowImpl接口的實(shí)例變量汇歹,并且有一個(gè)drawWindow方法屁擅,該方法將創(chuàng)建一個(gè)Window對(duì)象,并調(diào)用draw方法产弹。LinuxOs和WindowsOs類分別是Linux和Windows操作系統(tǒng)的實(shí)現(xiàn)派歌,它們都是Os抽象類的子類。它們實(shí)現(xiàn)了createWindow方法痰哨,并返回一個(gè)具體的Window對(duì)象胶果。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 橋接模式可以將抽象部分和實(shí)現(xiàn)部分分離,使它們可以獨(dú)立變化斤斧,從而達(dá)到靈活性和可擴(kuò)展性的目的早抠。
- 橋接模式可以讓客戶端代碼僅關(guān)注抽象部分,而不必關(guān)注實(shí)現(xiàn)部分的細(xì)節(jié)
- 橋接模式可以減少繼承的使用撬讽,因?yàn)槔^承是一種靜態(tài)的方式蕊连,而橋接模式則是一種動(dòng)態(tài)的方式。
缺點(diǎn):
- 橋接模式需要增加額外的抽象和實(shí)現(xiàn)層次游昼,從而增加系統(tǒng)的復(fù)雜度和理解難度甘苍。
- 橋接模式需要對(duì)系統(tǒng)進(jìn)行重新設(shè)計(jì),從而增加了開發(fā)的時(shí)間和成本烘豌。
運(yùn)用場(chǎng)景:
橋接模式適用于以下情況:
- 當(dāng)一個(gè)類存在兩個(gè)獨(dú)立變化的維度時(shí)载庭,可以使用橋接模式來將它們解耦,從而使它們可以獨(dú)立變化廊佩。
- 當(dāng)一個(gè)類需要在運(yùn)行時(shí)切換不同的實(shí)現(xiàn)時(shí)昧捷,可以使用橋接模式來實(shí)現(xiàn)這一需求。
- 當(dāng)一個(gè)類的抽象和實(shí)現(xiàn)部分可以分別擴(kuò)展時(shí)罐寨,可以使用橋接模式來實(shí)現(xiàn)這一需求靡挥。
總結(jié)
總的來說,橋接模式是一種結(jié)構(gòu)性設(shè)計(jì)模式鸯绿,它可以將抽象部分和實(shí)現(xiàn)部分解耦跋破,從而使它們可以獨(dú)立變化而不會(huì)互相影響。Java作為一門面向?qū)ο蟮木幊陶Z言瓶蝴,非常適合使用橋接模式來實(shí)現(xiàn)復(fù)雜的軟件系統(tǒng)毒返。