上海閔行天氣連云港seo優(yōu)化公司
概敘:橋接模式用一種巧妙的方式處理多層繼承存在的問題,
用抽象關(guān)聯(lián)取代了傳統(tǒng)的多層繼承,
將類之間的靜態(tài)繼承關(guān)系轉(zhuǎn)換為動態(tài)的對象組合關(guān)系,
使得系統(tǒng)更加靈活,并易于擴(kuò)展,
同時有效控制了系統(tǒng)中類的個數(shù),橋接定義如下:
橋接模式:將抽象部分與它實現(xiàn)的部分分離,使它們都可用獨立地變化。
它是一種對象結(jié)構(gòu)模式,又稱柄體模式(Handle and Body)或接口模式.
橋接模式的結(jié)構(gòu)與其名稱一樣,存在一條連接兩個繼承等級結(jié)構(gòu)的橋,
舉例:
讓我們通過一個更簡單的例子來更深入地理解橋接設(shè)計模式以及它是如何解決問題的。考慮一個圖形繪制的場景,有兩個維度的變化:形狀和顏色。在沒有橋接模式的情況下,可能會考慮創(chuàng)建形狀的子類和顏色的子類,然后通過組合它們來得到所有可能的組合。這會導(dǎo)致類的爆炸,因為每個形狀都需要與每種顏色組合一次。
不使用橋接模式的情況:
// 不使用橋接模式的代碼
class CircleRed extends Circle {@Overridepublic void draw() {System.out.println("Drawing red circle");}
}class CircleGreen extends Circle {@Overridepublic void draw() {System.out.println("Drawing green circle");}
}class RectangleRed extends Rectangle {@Overridepublic void draw() {System.out.println("Drawing red rectangle");}
}class RectangleGreen extends Rectangle {@Overridepublic void draw() {System.out.println("Drawing green rectangle");}
}// 客戶端代碼
public class WithoutBridgePatternExample {public static void main(String[] args) {CircleRed redCircle = new CircleRed();redCircle.draw(); // Drawing red circleCircleGreen greenCircle = new CircleGreen();greenCircle.draw(); // Drawing green circleRectangleRed redRectangle = new RectangleRed();redRectangle.draw(); // Drawing red rectangleRectangleGreen greenRectangle = new RectangleGreen();greenRectangle.draw(); // Drawing green rectangle}
}
上述代碼存在的問題是,每增加一種形狀或顏色的組合,都需要創(chuàng)建一個新的子類,導(dǎo)致類的數(shù)量呈指數(shù)級增長。
使用橋接模式的情況:
現(xiàn)在,我們使用橋接模式來解決這個問題:
// 使用橋接模式的代碼
interface Color {void applyColor();
}class Red implements Color {@Overridepublic void applyColor() {System.out.println("Applying red color");}
}class Green implements Color {@Overridepublic void applyColor() {System.out.println("Applying green color");}
}abstract class Shape {protected Color color;public Shape(Color color) {this.color = color;}abstract void draw();
}class Circle extends Shape {public Circle(Color color) {super(color);}@Overridevoid draw() {System.out.print("Drawing circle: ");color.applyColor();}
}class Rectangle extends Shape {public Rectangle(Color color) {super(color);}@Overridevoid draw() {System.out.print("Drawing rectangle: ");color.applyColor();}
}// 客戶端代碼
public class WithBridgePatternExample {public static void main(String[] args) {Shape redCircle = new Circle(new Red());redCircle.draw(); // Drawing circle: Applying red colorShape greenRectangle = new Rectangle(new Green());greenRectangle.draw(); // Drawing rectangle: Applying green color}
}
在這個例子中,通過使用橋接模式,我們將形狀(Circle
和 Rectangle
)和顏色(Red
和 Green
)分離開來。這樣,每個維度的變化都可以獨立進(jìn)行擴(kuò)展,而不需要創(chuàng)建大量的子類。如果需要新增一種顏色或形狀,只需添加相應(yīng)的類即可,不會導(dǎo)致類的爆炸。橋接模式使得系統(tǒng)更加靈活,易于擴(kuò)展和維護(hù)。
比如新增一個顏色后的代碼
假設(shè)我們要新增一種顏色,比如藍(lán)色(Blue),我們只需添加一個實現(xiàn)Color
接口的Blue
類,并在客戶端中創(chuàng)建一個新的Shape
對象,將這個新的顏色傳遞給它。
// 新增的藍(lán)色類
class Blue implements Color {@Overridepublic void applyColor() {System.out.println("Applying blue color");}
}// 在客戶端中使用新增的藍(lán)色
public class AddNewColorExample {public static void main(String[] args) {Shape blueCircle = new Circle(new Blue());blueCircle.draw(); // Drawing circle: Applying blue color}
}
這里我們無需修改之前的形狀類(Circle
)或其他顏色類,而是通過新增一個實現(xiàn)Color
接口的類來添加新的顏色。這就是橋接模式的靈活性體現(xiàn)之處。新增一個顏色并不會影響到其他部分的代碼,保持了系統(tǒng)的可擴(kuò)展性。