桥接模式主要是将拥有多维度的复杂接口按不同的维度拆分成多个简单的接口,然后通过组合的形式进行重新封装。
假设有一个Shape类, 从形状的角度来扩展,可以扩展出矩形、圆形、三角形,从颜色的角度扩展,可以扩展红色、绿色和蓝色,仅使用继承的方式来扩展的话,这就会变得特别繁琐,比如红色矩形、绿色三角形等等。如果把颜色这一层抽离出去作为单独的接口Color,然后Shape通过组合的方式使用Color,这样就会简单很多。
1public interface Color {
2 String fill();
3}
4
5public abstract class Shape {
6 protected Color color;
7 public Shape(Color color) {
8 super(color);
9 }
10 abstract public String draw();
11}
如果需要蓝色正方形,我们需要继承Shape和实现Color。
1public class Square extends Shape {
2
3 public Square(Color color) {
4 super(color);
5 }
6
7 @Override
8 public String draw() {
9 return color.fill() + "正方形";
10 }
11}
12
13public class Blue implements Color {
14 @Override
15 public String fill() {
16 return "蓝色";
17 }
18}
19
20Shape blueSquare = new Square(new Blue());
当需要实现绿色正方形时,我们只需要再写一个Green类实现Color接口,并实例化作为参数传入到Square的构造方法即可。
public class Green implements Color {
@Override
public String fill() {
return "绿色";
}
}
Shape greenSquare = new Square(new Green());
桥接模式可以让我们更容易在多个维度扩展类,而且还能在运行时动态改变。我觉得桥接模式和装饰模式在某些程度比较相似,但是桥接模式是在最初设计时就将已知不同的维度特性进行拆分,而桥接模式是在原有类的基础上进行扩展原本未知的特性。