定義
將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。它是一種對象結(jié)構(gòu)型模式,又稱為柄體(Handle and Body)模式或接口(Interface)模式。
橋接模式將繼承關(guān)系轉(zhuǎn)換為關(guān)聯(lián)關(guān)系,從而降低了類與類之間的耦合,減少了代碼編寫量。將類與類之間繼承的關(guān)系,變?yōu)槌橄箢惢蛘呓涌谂c接口之間的關(guān)聯(lián)關(guān)系,實現(xiàn)了抽象化與實現(xiàn)化的脫耦。
角色
- 抽象化(Abstraction)角色:抽象化給出的定義,并保存一個對實現(xiàn)化對象的引用。
- 修正抽象化(Refined Abstraction)角色:擴展抽象化角色,改變和修正父類對抽象化的定義。
- 實現(xiàn)化(Implementor)角色:這個角色給出實現(xiàn)化角色的接口,但不給出具體的實現(xiàn)。必須指出的是,這個接口不一定和抽象化角色的接口定義相同,實際上,這兩個接口可以非常不一樣。實現(xiàn)化角色應(yīng)當(dāng)只給出底層操作,而抽象化角色應(yīng)當(dāng)只給出基于底層操作的更高一層的操作。
- 具體實現(xiàn)化(Concrete Implementor)角色:這個角色給出實現(xiàn)化角色接口的具體實現(xiàn)。
實例
抽象化角色
/**
* @author Royle.Huang
* @date 2018/12/30 11:54
* @description: 抽象化角色 Abstraction 顏色接口
*/
public interface Color {
void paint();
}
修正抽象化角色
/**
* @author Royle.Huang
* @date 2018/12/30 11:54
* @description: 修正抽象化角色 Refined Abstraction
*/
public class Red implements Color{
@Override
public void paint() {
System.out.print("red ");
}
}
public class Bule implements Color {
@Override
public void paint() {
System.out.print("blue ");
}
}
實現(xiàn)化角色
/**
* @author Royle.Huang
* @date 2018/12/30 11:58
* @description: 實現(xiàn)化角色 implementor 形狀
*/
public abstract class Shape {
protected Color color;
public Shape(Color color) {
this.color = color;
}
abstract void draw();
}
具體實現(xiàn)化角色
/**
* @author Royle.Huang
* @date 2018/12/30 11:59
* @description: 具體實現(xiàn)化角色 Concrete Implementor 圓
*/
public class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
void draw() {
color.paint();
System.out.println("circle");
}
}
/**
* @author Royle.Huang
* @date 2018/12/30 12:04
* @description: 具體實現(xiàn)化角色
*/
public class Rectangle extends Shape {
public Rectangle(Color color) {
super(color);
}
@Override
void draw() {
color.paint();
System.out.println("rectangle");
}
}
測試代碼
public class Test {
public static void main(String[] args) {
Shape circle = new Circle(new Red());
circle.draw();
}
}
運行結(jié)果
red circle
使用場景
- 如果你不希望在抽象和實現(xiàn)部分采用固定的綁定關(guān)系,可以采用橋接模式,來把抽象和實現(xiàn)部分分開,然后在程序運行期間來動態(tài)的設(shè)置抽象部分需要用到的具體的實現(xiàn),還可以動態(tài)切換具體的實現(xiàn)。
- 如果出現(xiàn)抽象部分和實現(xiàn)部分都應(yīng)該可以擴展的情況,可以采用橋接模式,讓抽象部分和實現(xiàn)部分可以獨立的變化,從而可以靈活的進行單獨擴展,而不是攪在一起,擴展一邊會影響到另一邊。
- 如果希望實現(xiàn)部分的修改,不會對客戶產(chǎn)生影響,可以采用橋接模式,客戶是面向抽象的接口在運行,實現(xiàn)部分的修改,可以獨立于抽象部分,也就不會對客戶產(chǎn)生影響了,也可以說對客戶是透明的。
- 如果采用繼承的實現(xiàn)方案,會導(dǎo)致產(chǎn)生很多子類,對于這種情況,可以考慮采用橋接模式,分析功能變化的原因,看看是否能分離成不同的緯度,然后通過橋接模式來分離它們,從而減少子類的數(shù)目。