設想若是要繪製矩形、圓形、橢圓、正方形,咱們至少須要4個形狀類,可是若是繪製的圖形須要具備不一樣的顏色,如紅色、綠色、藍色等,此時至少有以下兩種設計方案:ide
第一種方案是爲每一種形狀都提供一套各類顏色的版本ui
第二種方案是根據實際的須要對形狀和顏色進行組合this
對於有兩個變化維度(即兩個變化的緣由)的系統,採用方案二來進行設計系統中類的個數更少,且系統擴展更爲方便。設計方案二便是橋接模式的應用。橋接模式將繼承關係轉換爲關聯關係,從而下降了類與類之間的耦合,減小了代碼編寫量。設計
橋接模式(Bridge Pattern):將抽象部分與它的實現部分分離,使它們均可以獨立地變化。它是一種對象結構型模式,又稱爲柄體(Handle and Body)模式或接口(Interface)模式。code
抽象部分:對象
public abstract class Shape { private ShapeColor shapeColor; public Shape(ShapeColor color) { this.shapeColor = color; } public abstract String getShapeName(); @Override public String toString() { return "個人形狀是:" +this.getShapeName() + ", 個人顏色是:" + this.shapeColor.getColor(); } } public class Cycle extends Shape { public Cycle(ShapeColor color) { super(color); } @Override public String getShapeName() { return "圓形"; } } public class Square extends Shape { public Square(ShapeColor color) { super(color); } @Override public String getShapeName() { return "正方形"; } } public class Triangle extends Shape { public Triangle(ShapeColor color) { super(color); } @Override public String getShapeName() { return "三角形"; } }
實現部分:blog
public abstract class ShapeColor { public abstract String getColor(); } public class Bule extends ShapeColor { @Override public String getColor() { return "藍色"; } } public class Red extends ShapeColor { @Override public String getColor() { return "紅色"; } } public class Yellow extends ShapeColor { @Override public String getColor() { return "黃色"; } }
客戶端:繼承
public class Client { public static void main(String[] args) { ShapeColor yellow = new Yellow(); ShapeColor red = new Red(); Shape yellowCycle = new Cycle(yellow); Shape redCycle = new Cycle(red); Shape yellowSquire = new Square(yellow); Shape redSquire = new Square(red); System.out.println(yellowCycle); System.out.println(redCycle); System.out.println(yellowSquire); System.out.println(redSquire); } }
抽象部分的類繼承體系,頂層是Shape抽象類,Shape的實現類能夠有不少,圓形,三角形,正方形,菱形,還能夠隨意擴展出來很是多的形狀接口
實現部分的類繼承體系表示的是Shape的顏色,可有多重顏色,根據本身的須要,還能夠擴展出來更多的顏色get
抽象部分和實現部分二者是能夠獨立擴展的,二者之間的關係是組合的關係,實現部分做爲一個屬性,集成到抽象部分的類中去,這是兩個體系發生聯繫的地方,表如今類圖上,就是兩個互相獨立演化的部分,中間用一條線連起來,這條線看起來就像是一座橋,這個模式就叫作橋接模式
系統有兩個獨立的變化維度,而這兩個維度都須要進行擴展
想要防止由於多層次的繼承致使類數量的膨脹
抽象化角色和實現化角色能夠以繼承的方式獨立擴展而互不影響,在程序運行時能夠動態將一個抽象化子類的對象和一個實現化子類的對象進行組合,即系統須要對抽象化角色和實現化角色進行動態耦合