基本介紹
定義
將抽象部分與實現(xiàn)部分分離,使它們都可以獨立的變化。
介紹
- 橋接模式屬于結(jié)構(gòu)型模式。
- 舉個生活中的例子,一條數(shù)據(jù)線,一頭USB接口的可以連接電腦、充電寶等等,另一頭可以連接不同品牌的手機,通過這條數(shù)據(jù)線,兩頭不同的東西就可以連接起來,這就是橋接模式。
UML類圖

橋接模式UML類圖
角色說明:
- Abstraction(抽象化角色):一般是抽象類,定義該角色的行為,同時保存一個對實現(xiàn)化角色的引用。
- Implementor(實現(xiàn)化角色):接口或者抽象類,定義角色必需的行為和屬性。
- ConcreteImplementorA、ConcreteImplementorB(具體實現(xiàn)化角色):實現(xiàn)角色的具體行為。
具體實現(xiàn)
這里以穿衣服為例,不同職業(yè)的人可能要穿的衣服不一樣。
1、創(chuàng)建實現(xiàn)化角色。定義一個衣服接口:
interface Clothes {
String getName();
}
2、創(chuàng)建具體實現(xiàn)化角色。創(chuàng)建兩種衣服類:校服和襯衫。
public class Uniform implements Clothes {
@Override
public String getName() {
return "校服";
}
}
public class Shirt implements Clothes {
@Override
public String getName() {
return "襯衫";
}
}
3、創(chuàng)建抽象化角色。定義一個人物類,有一個穿衣服的方法,并且持有衣服類的引用。即抽象化角色持有實現(xiàn)化角色的引用,可以調(diào)用實現(xiàn)化角色的方法,達到橋接的作用。
public abstract class Person {
// 持有衣服類的引用
Clothes mClothes;
public void setClothes(Clothes clothes) {
mClothes = clothes;
}
// 穿衣服
protected abstract void dress();
}
4、創(chuàng)建具體抽象化角色。這里有兩種角色穿衣服:學(xué)生和程序員。
public class Student extends Person {
@Override
protected void dress() {
System.out.println("學(xué)生穿上" + mClothes.getName());
}
}
public class Coder extends Person {
@Override
protected void dress() {
System.out.println("程序員穿上" + mClothes.getName());
}
}
5、客戶端測試:
public void test() {
// 創(chuàng)建各種衣服對象
Clothes uniform = new Uniform();
Clothes shirt = new Shirt();
// 不同職業(yè)的人穿衣服
Person coder = new Coder();
coder.setClothes(shirt);
coder.dress();
System.out.println("--------------------------------------");
Person student = new Student();
student.setClothes(uniform);
student.dress();
System.out.println("--------------------------------------");
student.setClothes(shirt);
student.dress();
}
輸出結(jié)果:
程序員穿上襯衫
--------------------------------------
學(xué)生穿上校服
--------------------------------------
學(xué)生穿上襯衫
6、其他說明:
通過上面的例子可以看到,我們分離了兩端的變化。新增衣服和新增職業(yè)都變的非常簡單。假如我們再增一個維度的變化,例如加個年齡來區(qū)分怎么辦?這時我們就可以把Person類作為實現(xiàn)化角色,把不同年齡段作為抽象化角色,代碼就不寫了,有興趣可以去實現(xiàn)一下。
模式總結(jié)
應(yīng)用場景
- 一個類存在兩個或以上的獨立維度的變化,且這些維度都需要進行拓展。
- 不希望使用繼承或因為多層次繼承導(dǎo)致類的個數(shù)急劇增加時。
- 如果一個系統(tǒng)需要在構(gòu)件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態(tài)的繼承關(guān)系,可以通過橋接模式使他們在抽象層建立一個關(guān)聯(lián)關(guān)系。
優(yōu)點
- 分離了抽象與實現(xiàn)。讓抽象部分和實現(xiàn)部分獨立開來,分別定義接口,這有助于對系統(tǒng)進行分層,從而產(chǎn)生更好的結(jié)構(gòu)化的系統(tǒng)。
- 良好的擴展性。抽象部分和實現(xiàn)部分都可以分別獨立擴展,不會相互影響。
缺點
- 增加了系統(tǒng)的復(fù)雜性。
- 不容易設(shè)計,抽象與實現(xiàn)的分離要設(shè)計得好比較有難度。
Android中的源碼分析
橋接模式在Android中的源碼應(yīng)用還是非常廣泛的。比如AbsListView跟ListAdapter之間就是一個橋接模式。
1、AbsListView 與ListAdapter 之間的橋接模式
相關(guān)代碼就不貼了,看下它們的UML類圖就明白了。

AbsListView 與 ListAdapter 之間的橋接模式
這里AbsListView是抽象化角色,ListAdapter則是實現(xiàn)化角色。
2、其他
另外,Window 與 WindowManager 之間也是橋接模式。有興趣的可以去看下源碼體會體會。