橋接模式(Bridge),將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。優(yōu)先使用對象的合成/聚合將有助于你保持每個(gè)類被封裝,并被集中在單個(gè)任務(wù)上。這樣類和類繼承層次會(huì)保持較小規(guī)模,并且不太可能增長為不可控制的龐然大物。
適用場景
- 當(dāng)一個(gè)對象有多個(gè)變化因素的時(shí)候,通過抽象這些變化因素,將依賴具體實(shí)現(xiàn),修改為依賴抽象。
- 當(dāng)某個(gè)變化因素在多個(gè)對象中共享時(shí)。我們可以抽象出這個(gè)變化因素,然后實(shí)現(xiàn)這些不同的變化因素。
- 當(dāng)我們期望一個(gè)對象的多個(gè)變化因素可以動(dòng)態(tài)的變化,而且不影響客戶的程序的使用時(shí)。
優(yōu)點(diǎn)
- 分離抽象和實(shí)現(xiàn)部分
- 更好的擴(kuò)展性
- 可動(dòng)態(tài)地切換實(shí)現(xiàn)
- 可減少子類的個(gè)數(shù)
缺點(diǎn)
- 橋接模式的引入會(huì)增加系統(tǒng)的理解與設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽象進(jìn)行設(shè)計(jì)與編程。
- 橋接模式要求正確識(shí)別出系統(tǒng)中兩個(gè)獨(dú)立變化的維度,因此其使用范圍具有一定的局限性。
UML結(jié)構(gòu)圖

BridgePattern
源碼
Implementor:實(shí)現(xiàn)接口
/**
* 實(shí)現(xiàn)接口
*
* Created by zhenguo on 12/8/14.
*/
public interface Implementor {
public void operation();
}
ConcreteImplementorA:實(shí)現(xiàn)派生類A
/**
* 實(shí)現(xiàn)派生類A
*
* Created by zhenguo on 12/8/14.
*/
public class ConcreteImplementorA implements Implementor {
@Override
public void operation() {
System.out.println("具體實(shí)現(xiàn)A的方法執(zhí)行");
}
}
ConcreteImplementorB:實(shí)現(xiàn)派生類B
/**
* 實(shí)現(xiàn)派生類B
*
* Created by zhenguo on 12/8/14.
*/
public class ConcreteImplementorB implements Implementor {
@Override
public void operation() {
System.out.println("具體實(shí)現(xiàn)B的方法執(zhí)行");
}
}
Abstraction:抽象類
/**
* 抽象類
*
* Created by zhenguo on 12/8/14.
*/
public abstract class Abstraction {
protected Implementor implementor;
public void setImplementor(Implementor implementor) {
this.implementor = implementor;
}
public abstract void operation();
}
RefinedAbstraction:抽象實(shí)現(xiàn)子類
/**
* 抽象實(shí)現(xiàn)子類
*
* Created by zhenguo on 12/8/14.
*/
public class RefinedAbstraction extends Abstraction {
@Override
public void operation() {
if (implementor != null) {
implementor.operation();
}
}
}
Client:客戶端調(diào)用
/**
* 客戶端調(diào)用
* 橋接模式(Bridge),將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化。
*
* Created by zhenguo on 12/8/14.
*/
public class Client {
public static void main(String[] args) {
Abstraction abstraction = new RefinedAbstraction();
abstraction.setImplementor(new ConcreteImplementorA());
abstraction.operation();
abstraction.setImplementor(new ConcreteImplementorB());
abstraction.operation();
}
}
設(shè)計(jì)模式系列:
| 創(chuàng)建型 | 結(jié)構(gòu)型 | 行為型 |
|---|---|---|
|
工廠方法 簡單工廠 抽象工廠 建造者模式 單例模式 原型模式 |
組合模式 外觀模式 橋接模式 代理模式 享元模式 適配器模式 裝飾模式 |
策略模式 模板方法 狀態(tài)模式 觀察者模式 備忘錄模式 迭代器模式 命令模式 職責(zé)鏈模式 解釋器模式 訪問者模式 中介者模式 |