桥接(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) 可以各自独立扩展,互不干扰。
维度 |
描述 |
抽象部分 |
定义高层操作,通常是一个类或接口,它包含对实现部分的引用 |
实现部分 |
定义地层行为,通常是接口或抽象类,用于被多个抽象类组合使用 |
口诀:
“一个类里由一个接口变量,并且这个接口决定了它的底层实现”