設計模式學習心得<橋接模式 Bridge>
說真的在此之前,幾乎沒有對于橋接模式的應用場景概念。
橋接(Bridge)是用于把抽象化與實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬于結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。
這種模式涉及到一個作為橋接的接口,使得實體類的功能獨立于接口實現類。這兩種類型的類可被結構化改變而互不影響。
我們通過下面的實例來演示橋接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象類方法但是不同的橋接實現類,來畫出不同顏色的圓。
概述
-
意圖
將抽象部分與實現部分分離,使它們都可以獨立的變化。 -
主要解決
在有多種可能會變化的情況下,用繼承會造成類爆炸問題,擴展起來不靈活。 -
何時使用
實現系統可能有多個角度分類,每一種角度都可能變化。 -
如何解決
把這種多角度分類分離出來,讓它們獨立變化,減少它們之間耦合。 -
關鍵代碼
抽象類依賴實現類。 -
應用實例
- 墻上的開關,可以看到的開關是抽象的,不用管里面具體怎么實現的。
- 優點
- 抽象和實現的分離。
- 優秀的擴展能力。
- 實現細節對客戶透明。
-
缺點
橋接模式的引入會增加系統的理解與設計難度,由于聚合關聯關系建立在抽象層,要求開發者針對抽象進行設計與編程。 -
使用場景
- 如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯系,通過橋接模式可以使它們在抽象層建立一個關聯關系。
- 對于那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。
- 一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。
- 注意事項
對于兩個獨立變化的維度,使用橋接模式再適合不過了。
實現
- 橋接模式主要包含如下幾個角色:
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 運行結果
?白色的正方形
白色的長方形
浮生潦草閑愁廣,一聽啤酒一口盡
浙公網安備 33010602011771號