桥接模式(Bridge Pattern)

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。

适用场景

有多种可能变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。例如一个类存在两个维度,一个维度可以扩展为2个维度,一个维度可以扩展为3个维度,排列组合后就是2x3个实例。

以画图为例,要实现一个画图工具,假设可以画圆和矩形,也可以给其进行颜色填充。按照定义,抽象和实现必须分开,

  • 抽象维度: 图形(圆、矩形、正方形)
  • 实现维度: 颜色(红、绿、蓝)

定义不同的颜色,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public interface Color {
void fill();
}
public class Red implements Color {
@Override
public void fill() {
System.out.println("fillin red");
}
}
public class Blue implements Color {
@Override
public void fill() {
System.out.println("fillin blue");
}
}
public class Green implements Color {
@Override
public void fill() {
System.out.println("fillin green");
}
}

定义桥接类,

1
2
3
4
5
6
7
8
9
public abstract class Shape {
protected Color color;

protected Shape(Color color) {
this.color = color;
}

public abstract void draw(); //
}

分离实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class Circle extends Shape {
public Circle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.println("Circle ->");
color.fill();
}
}
public class Rectangle extends Shape {
public Rectangle(Color color) {
super(color);
}
@Override
public void draw() {
System.out.println("Rectangle ->");
color.fill();
}
}
public class Square extends Shape {
public Square(Color color) {
super(color);
}
@Override
public void draw() {
System.out.println("Square ->");
color.fill();
}
}

按需所取,

1
2
3
4
5
6
7
public class Client {
public static void main(String[] args) {
Shape redCircle = new Circle(new Red());
Shape blueRectangle = new Rectangle(new Blue());
Shape greenSquare = new Square(new Green());
}
}

总结

桥接模式的核心特征是两个独立变化的维度

🔵抽象部分(Abstraction) 和 🔵实现部分(Implementor) 可以各自独立扩展,互不干扰。

维度 描述
抽象部分 定义高层操作,通常是一个类或接口,它包含对实现部分的引用
实现部分 定义地层行为,通常是接口或抽象类,用于被多个抽象类组合使用

口诀:

“一个类里由一个接口变量,并且这个接口决定了它的底层实现”