在 GoF 的《設(shè)計(jì)模式》一書中,橋接模式被定義為:“將抽象和實(shí)現(xiàn)解耦,讓它們可以獨(dú)立變化?!倍x中的“抽象”,指的并非“抽象類”或“接口”,而是被抽象出來的一套“類庫”,它只包含骨架代碼,真正的業(yè)務(wù)邏輯需要委派給定義中的“實(shí)現(xiàn)”來完成。而定義中的“實(shí)現(xiàn)”,也并非“接口的實(shí)現(xiàn)類”,而是一套獨(dú)立的“類庫”。
應(yīng)用場景
系統(tǒng)可能有多個(gè)維度,每個(gè)維度都有可能變化。
類圖

image.png
將Color類組合在Shape中來將形狀和顏色解耦,各自維護(hù)各自的變化,這里體現(xiàn)了組合優(yōu)于繼承的設(shè)計(jì)原則。
橋接模式的引入會(huì)增加系統(tǒng)的理解與設(shè)計(jì)難度,由于聚合關(guān)聯(lián)關(guān)系建立在抽象層,要求開發(fā)者針對抽象進(jìn)行設(shè)計(jì)與編程。
代碼實(shí)現(xiàn)
Color
public abstract class Color {
public abstract void paint(String shape);
}
Red
public class Red extends Color {
@Override
public void paint(String shape) {
System.out.println("紅色的" + shape);
}
}
Green
public class Green extends Color {
@Override
public void paint(String shape) {
System.out.println("綠色的" + shape);
}
}
Shape
public abstract class Shape {
protected Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw();
}
Circle
public class Circle extends Shape {
@Override
public void draw() {
color.paint("圓形");
}
}
Square
public class Square extends Shape {
@Override
public void draw() {
color.paint("正方形");
}
}
Main
public class Main {
public static void main(String[] args) {
Shape shape;
Color color;
color = new Red();
shape = new Circle();
shape.setColor(color);
shape.draw();
color = new Green();
shape = new Square();
shape.setColor(color);
shape.draw();
}
}
至此,我們已經(jīng)完成了橋接模式的學(xué)習(xí)。橋接模式在實(shí)際項(xiàng)目中并不常用,這里我們了解認(rèn)識即可。