橋接適用於把抽象化和實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構性模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦 ...
橋接適用於把抽象化和實現化解耦,使得二者可以獨立變化。這種類型的設計模式屬於結構性模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦
這種模式設計到一個作為橋接的介面,使得實體類的功能獨立於介面實現類。這兩種類型的類可以被結構化改變而不互相影響。
介紹
設計模式意圖: 將抽象部分和實現部分分離,使得它們可以獨立變化。
優點:
- 抽象和實現的分離
- 優秀的拓展能力
缺點: 橋接模式的引入會增加系統的理解和設計難度,由於聚合掛鏈關係建立在抽象層,要求開發者針對抽象設計與編程。
使用場景:
- 如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯繫,通過橋接模式可以使它們在抽象層建立一個關聯關係。
- 對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。
- 一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴展。
總結:
即我們可以通過使用介面類型的變數來調用實現類的引用。
實現
我們有一個作為橋接實現的 DrawAPI 介面和實現了 DrawAPI 介面的實體類 RedCircle、GreenCircle。Shape 是一個抽象類,將使用 DrawAPI 的對象。BridgePatternDemo,我們的演示類使用 Shape 類來畫出不同顏色的圓。
創建橋接介面
public interface DrawAPI {
public void drawCircle(int radius, int x, int y);
}
創建實現了 DrawAPI 介面的實體橋接實現類
類RedCircle
public class RedCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: red, radius: "
+ radius +", x: " +x+", "+ y +"]");
}
}
類GreenCircle
public class GreenCircle implements DrawAPI {
@Override
public void drawCircle(int radius, int x, int y) {
System.out.println("Drawing Circle[ color: green, radius: "
+ radius +", x: " +x+", "+ y +"]");
}
}
使用 DrawAPI 介面創建抽象類 Shape
public abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI){
this.drawAPI = drawAPI;
}
public abstract void draw();
}
創建實現了 Shape 介面的實體類。
public class Circle extends Shape {
private int x, y, radius;
public Circle(int x, int y, int radius, DrawAPI drawAPI) {
super(drawAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
public void draw() {
drawAPI.drawCircle(radius,x,y);
}
}
使用 Shape 和 DrawAPI 類畫出不同顏色的圓
public class BridgePatternDemo {
public static void main(String[] args) {
Shape redCircle = new Circle(100,100, 10, new RedCircle());
Shape greenCircle = new Circle(100,100, 10, new GreenCircle());
redCircle.draw();
greenCircle.draw();
}
}
輸出結果
Drawing Circle[ color: red, radius: 10, x: 100, 100]
Drawing Circle[ color: green, radius: 10, x: 100, 100]