說真的在此以前,幾乎沒有對於橋接模式的應用場景概念。java
橋接(Bridge)是用於把抽象化與實現化解耦,使得兩者能夠獨立變化。這種類型的設計模式屬於結構型模式,它經過提供抽象化和實現化之間的橋接結構,來實現兩者的解耦。編程
這種模式涉及到一個做爲橋接的接口,使得實體類的功能獨立於接口實現類。這兩種類型的類可被結構化改變而互不影響。設計模式
咱們經過下面的實例來演示橋接模式(Bridge Pattern)的用法。其中,能夠使用相同的抽象類方法可是不一樣的橋接實現類,來畫出不一樣顏色的圓。this
意圖
將抽象部分與實現部分分離,使它們均可以獨立的變化。設計
主要解決
在有多種可能會變化的狀況下,用繼承會形成類爆炸問題,擴展起來不靈活。code
什麼時候使用
實現系統可能有多個角度分類,每一種角度均可能變化。blog
如何解決
把這種多角度分類分離出來,讓它們獨立變化,減小它們之間耦合。繼承
關鍵代碼
抽象類依賴實現類。接口
缺點
橋接模式的引入會增長系統的理解與設計難度,因爲聚合關聯關係創建在抽象層,要求開發者針對抽象進行設計與編程。開發
Abstraction
public abstract class Shape { Color color; public void setColor(Color color) { this.color = color; } public abstract void draw(); }
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("正方形"); } }
Implementor
public interface Color { public void bepaint(String shape); }
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); } }
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(); } }
白色的正方形 白色的長方形