設計模式學習心得<橋接模式 Bridge>

說真的在此以前,幾乎沒有對於橋接模式的應用場景概念。java

橋接(Bridge)是用於把抽象化與實現化解耦,使得兩者能夠獨立變化。這種類型的設計模式屬於結構型模式,它經過提供抽象化和實現化之間的橋接結構,來實現兩者的解耦。編程

這種模式涉及到一個做爲橋接的接口,使得實體類的功能獨立於接口實現類。這兩種類型的類可被結構化改變而互不影響。設計模式

咱們經過下面的實例來演示橋接模式(Bridge Pattern)的用法。其中,能夠使用相同的抽象類方法可是不一樣的橋接實現類,來畫出不一樣顏色的圓。this

概述


  • 意圖
    將抽象部分與實現部分分離,使它們均可以獨立的變化。設計

  • 主要解決
    在有多種可能會變化的狀況下,用繼承會形成類爆炸問題,擴展起來不靈活。code

  • 什麼時候使用
    實現系統可能有多個角度分類,每一種角度均可能變化。blog

  • 如何解決
    把這種多角度分類分離出來,讓它們獨立變化,減小它們之間耦合。繼承

  • 關鍵代碼
    抽象類依賴實現類。接口

  • 應用實例
  1. 牆上的開關,能夠看到的開關是抽象的,不用管裏面具體怎麼實現的。
  • 優勢
  1. 抽象和實現的分離。
  2. 優秀的擴展能力。
  3. 實現細節對客戶透明。
  • 缺點
    橋接模式的引入會增長系統的理解與設計難度,因爲聚合關聯關係創建在抽象層,要求開發者針對抽象進行設計與編程。開發

  • 使用場景
  1. 若是一個系統須要在構件的抽象化角色和具體化角色之間增長更多的靈活性,避免在兩個層次之間創建靜態的繼承聯繫,經過橋接模式能夠使它們在抽象層創建一個關聯關係。
  2. 對於那些不但願使用繼承或由於多層次繼承致使系統類的個數急劇增長的系統,橋接模式尤其適用。
  3. 一個類存在兩個獨立變化的維度,且這兩個維度都須要進行擴展。
  • 注意事項
    對於兩個獨立變化的維度,使用橋接模式再適合不過了。

實現


  • 橋接模式主要包含以下幾個角色:
    Abstraction:抽象類。
    RefinedAbstraction:擴充抽象類。
    Implementor:實現類接口。
    ConcreteImplementor:具體實現類 。

  • step 1 形狀類:該類爲一個抽象類,主要提供畫形狀的方法:Abstraction
public abstract class Shape {
    Color color;

    public void setColor(Color color) {
        this.color = color;
    }

    public abstract void draw();
}
  • step 2 三個形狀 。RefinedAbstraction

圓形:Circle.java

public class Circle extends Shape{

    public void draw() {
        color.bepaint("正方形");
    }
}

長方形:Rectangle.java

public class Rectangle extends Shape{

    public void draw() {
        color.bepaint("長方形");
    }

}

正方形:Square.java

public class Square extends Shape{

    public void draw() {
        color.bepaint("正方形");
    }

}
  • step 3 顏色接口。Implementor
public interface Color {
    public void bepaint(String shape);
}
  • step 4 三個顏色實現類。ConcreteImplementor

白色:White.java

public class White implements Color{

    public void bepaint(String shape) {
        System.out.println("白色的" + shape);
    }

}

灰色:Gray.java

public class Gray implements Color{

    public void bepaint(String shape) {
        System.out.println("灰色的" + shape);
    }
}

黑色:Black.java

public class Black implements Color{

    public void bepaint(String shape) {
        System.out.println("黑色的" + shape);
    }
}
  • step 4 客戶端。Client
public class Client {
    public static void main(String[] args) {
        //白色
        Color white = new White();
        //正方形
        Shape square = new Square();
        //白色的正方形
        square.setColor(white);
        square.draw();

        //長方形
        Shape rectange = new Rectangle();
        rectange.setColor(white);
        rectange.draw();
    }
}
  • step 5 運行結果
​白色的正方形
白色的長方形
相關文章
相關標籤/搜索