《設(shè)計模式》橋接模式

基本介紹

定義

將抽象部分與實現(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)用還是非常廣泛的。比如AbsListViewListAdapter之間就是一個橋接模式。

1、AbsListViewListAdapter 之間的橋接模式
相關(guān)代碼就不貼了,看下它們的UML類圖就明白了。

AbsListView 與 ListAdapter 之間的橋接模式

這里AbsListView是抽象化角色,ListAdapter則是實現(xiàn)化角色。

2、其他
另外,WindowWindowManager 之間也是橋接模式。有興趣的可以去看下源碼體會體會。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 Android的設(shè)計模式系列文章介紹,歡迎關(guān)注,持續(xù)更新中: Android的設(shè)計模式-設(shè)計模式的六大原則一...
    四月葡萄閱讀 6,103評論 2 12
  • 橋接模式(Bridge) 在現(xiàn)實生活中,某些類具有兩個或多個維度的變化,如圖形既可按形狀分,又可按顏色分。如何設(shè)計...
    Acton_zhang閱讀 473評論 0 1
  • 目錄 本文的結(jié)構(gòu)如下: 引言 什么是橋接模式 模式的結(jié)構(gòu) 典型代碼 代碼示例 優(yōu)點和缺點 適用環(huán)境 模式應(yīng)用 一、...
    w1992wishes閱讀 1,877評論 0 6
  • 晚景事順多吉祥, 只嘆風光近夕陽。 杖黎攜酒訪好友, 名山大川夢里藏。 (清風明月于十二月六號)
    清風明月馮耀杰閱讀 173評論 0 7
  • 文/婉兮 1 我是2014年接觸到直播的。 那時我還在上高中,正處于極度愛美卻又極度缺錢的年紀。開賬號是跟風而動,...
    婉xi閱讀 3,567評論 15 50

友情鏈接更多精彩內(nèi)容