設計模式--橋接模式(Bridge)

橋接模式(Bridge)

在現(xiàn)實生活中溶握,某些類具有兩個或多個維度的變化,如圖形既可按形狀分,又可按顏色分俏橘。如何設計類似于 Photoshop 這樣的軟件,能畫不同形狀和不同顏色的圖形呢圈浇?如果用繼承方式寥掐,m 種形狀和 n 種顏色的圖形就有 m×n 種,不但對應的子類很多磷蜀,而且擴展困難召耘。如果用橋接模式就能很好地解決這些問題。

橋接模式的定義與特點

  • 橋接(Brideg)模式的定義如下:用于把抽象化與實現(xiàn)化解耦褐隆,使得二者可以獨立的變化污它。這種類型的設計模式屬于結構型模式,它通過提供抽象化和實現(xiàn)化之間的橋接結構,來實現(xiàn)二者的解耦衫贬。
  • 橋接(Brideg)模式的優(yōu)點:1.抽象和實現(xiàn)的分離德澈。 2.優(yōu)秀的擴展能力。3. 實現(xiàn)細節(jié)對客戶透明固惯。
  • 橋接(Brideg)模式的缺點:橋接模式的引入會增加系統(tǒng)的理解與設計難度梆造,由于聚合關聯(lián)關系建立在抽象層,要求開發(fā)者針對抽象進行設計與編程缝呕。

橋接模式的結構與實現(xiàn)

1.模式的結構

橋接(Bridge)模式包含以下主要角色澳窑。

  1. 抽象化(Abstraction)角色:定義抽象類,并包含一個對實現(xiàn)化對象的引用供常。
  2. 擴展抽象化(Refined Abstraction)角色:是抽象化角色的子類摊聋,實現(xiàn)父類中的業(yè)務方法,并通過組合關系調用實現(xiàn)化角色中的業(yè)務方法栈暇。
  3. 實現(xiàn)化(Implementor)角色:定義實現(xiàn)化角色的接口麻裁,供擴展抽象化角色調用。
  4. 具體實現(xiàn)化(Concrete Implementor)角色:給出實現(xiàn)化角色接口的具體實現(xiàn)源祈。
    其結構圖如圖所示煎源。


    結構圖
2.模式的實現(xiàn)

橋接模式的代碼如下:

package bridgePattern;
public class BridgeTest
{
    public static void main(String[] args)
    {
        Implementor imple=new ConcreteImplementorA();
        Abstraction abs=new RefinedAbstraction(imple);
        abs.Operation();
    }
}
//實現(xiàn)化角色
interface Implementor
{
    public void OperationImpl();
}
//具體實現(xiàn)化角色
class ConcreteImplementorA implements Implementor
{
    public void OperationImpl()
    {
        System.out.println("具體實現(xiàn)化(Concrete Implementor)角色被訪問" );
    }
}
//抽象化角色
abstract class Abstraction
{
   protected Implementor imple;
   protected Abstraction(Implementor imple)
   {
       this.imple=imple;
   }
   public abstract void Operation();   
}
//擴展抽象化角色
class RefinedAbstraction extends Abstraction
{
   protected RefinedAbstraction(Implementor imple)
   {
       super(imple);
   }
   public void Operation()
   {
       System.out.println("擴展抽象化(Refined Abstraction)角色被訪問" );
       imple.OperationImpl();
   }
}

程序的運行結果如下:

擴展抽象化(Refined Abstraction)角色被訪問
具體實現(xiàn)化(Concrete Implementor)角色被訪問

橋接模式的實例

我們有一個作為橋接實現(xiàn)的 DrawAPI 接口和實現(xiàn)了 DrawAPI 接口的實體類 RedCircle、GreenCircle香缺。Shape 是一個抽象類手销,將使用 DrawAPI 的對象。BridgePatternDemo图张,我們的演示類使用 Shape 類來畫出不同顏色的圓锋拖。

類圖

1. 創(chuàng)建橋接實現(xiàn)接口。DrawAPI.java

public interface DrawAPI {
   public void drawCircle(int radius, int x, int y);
}

2. 創(chuàng)建實現(xiàn)了 DrawAPI 接口的實體橋接實現(xiàn)類祸轮。RedCircle.java兽埃、GreenCircle.java

public class RedCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: red, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}
public class GreenCircle implements DrawAPI {
   @Override
   public void drawCircle(int radius, int x, int y) {
      System.out.println("Drawing Circle[ color: green, radius: "
         + radius +", x: " +x+", "+ y +"]");
   }
}

3. 使用 DrawAPI 接口創(chuàng)建抽象類。Shape.java

public abstract class Shape {
   protected DrawAPI drawAPI;
   protected Shape(DrawAPI drawAPI){
      this.drawAPI = drawAPI;
   }
   public abstract void draw();  
}

4. 創(chuàng)建實現(xiàn)了 Shape 接口的實體類适袜。Circle.java

public class Circle extends Shape {
   private int x, y, radius;
 
   public Circle(int x, int y, int radius, DrawAPI drawAPI) {
      super(drawAPI);
      this.x = x;  
      this.y = y;  
      this.radius = radius;
   }
 
   public void draw() {
      drawAPI.drawCircle(radius,x,y);
   }
}

5. 使用 Shape 和 DrawAPI 類畫出不同顏色的圓柄错。BridgePatternDemo.java

public class BridgePatternDemo {
   public static void main(String[] args) {
      Shape redCircle = new Circle(100,100, 10, new RedCircle());
      Shape greenCircle = new Circle(100,100, 10, new GreenCircle());
 
      redCircle.draw();
      greenCircle.draw();
   }
}

執(zhí)行程序,輸出結果:

Drawing Circle[ color: red, radius: 10, x: 100, 100]
Drawing Circle[ color: green, radius: 10, x: 100, 100]

橋接模式實際開發(fā)中的應用場景

  • JDBC驅動程序
  • AWT中的Peer架構
  • 銀行日志管理:
    1.格式分類:操作日志苦酱、交易日志售貌、異常日志
    2.距離分類:本地記錄日志、異地記錄日志
  • 人力資源系統(tǒng)中的獎金計算模塊:
    1.獎金分類:個人獎金疫萤、團體獎金、激勵獎金
    2.部門分類:人事部門给僵、銷售部門帝际、研發(fā)部門
  • OA系統(tǒng)中的消息處理:
    1.業(yè)務類型:普通消息、加急消息斑粱、特級消息
    2.發(fā)送消息方式:系統(tǒng)內消息脯爪、手機短息、郵件

橋接模式總結

  • 橋接模式可以取代多層繼承的方案尚揣。多層繼承違背了單一職責原則掖举,復用性較差,類的個數(shù)也非常多方篮。橋接模式可以極大的減少子類的個數(shù)励负,從而降低管理和維護的成本。
  • 橋接模式極大的提高了系統(tǒng)可擴展性巾表,在兩個變化維度中任意擴展一個維度裕照,都不需要修改原有的系統(tǒng),符合開閉原則晋南。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末负间,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子政溃,更是在濱河造成了極大的恐慌,老刑警劉巖董虱,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異云头,居然都是意外死亡,警方通過查閱死者的電腦和手機匣砖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門猴鲫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谣殊,“玉大人,你說我怎么就攤上這事匣缘∠侍模” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長盒音。 經(jīng)常有香客問我祥诽,道長,這世上最難降的妖魔是什么雄坪? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任维哈,我火速辦了婚禮绳姨,結果婚禮上,老公的妹妹穿的比我還像新娘阔挠。我一直安慰自己飘庄,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布跪削。 她就那樣靜靜地躺著谴仙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碾盐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天廓旬,我揣著相機與錄音,去河邊找鬼谐腰。 笑死孕豹,一個胖子當著我的面吹牛十气,可吹牛的內容都是我干的励背。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼砸西,長吁一口氣:“原來是場噩夢啊……” “哼叶眉!你這毒婦竟也來了芹枷?” 一聲冷哼從身側響起衅疙,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤饱溢,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绩郎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡挖函,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了浅萧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡哲思,死狀恐怖洼畅,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情棚赔,我是刑警寧澤帝簇,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布徘郭,位于F島的核電站,受9級特大地震影響丧肴,放射性物質發(fā)生泄漏残揉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一芋浮、第九天 我趴在偏房一處隱蔽的房頂上張望抱环。 院中可真熱鬧,春花似錦纸巷、人聲如沸镇草。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梯啤。三九已至,卻和暖如春存哲,著一層夾襖步出監(jiān)牢的瞬間因宇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工祟偷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留察滑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓肩袍,卻偏偏與公主長得像杭棵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子氛赐,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353