定义
将抽象部分与实现部分分离,使它们都可以独立的变化。
演化
1.请设计一个绘图工具,功能比较简单,它能绘制不同的图形,和不同的颜色。为了让绘制对象具备统一的绘制行为,我们一般会抽象出来Shape和Color两个接口。
public interface Shape {
void drawShape();
}
public interface Color {
void drawColor();
}
2.想让一个类具备两个接口的功能,可以让具体的绘制对象去实现这两个接口,如绘制一个红色的圆。
public class RedCircle implements Shape, Color {
@Override
public void drawColor() {
System.out.println("Red");
}
@Override
public void drawShape() {
System.out.println("Circle");
}
}
在Shape和Color的实现类极少的情况下,这种写法已经实现了预期的需求。但显然,一个绘图工具可绘制的东西不可能如此简单。按照这个写法,如果有10种图形,10种颜色。为了满足调用方绘制图形的所有要求,我们需要预先定义100个实现类,这显然是行不通的。虽然一般情况下,工具的封装需要尽量减少调用方的麻烦,但在定义如此复杂的情况下就需要重新权衡利弊了。
3.分析解决2中的问题,可以发现,Shape和Color本质上是两个完全不同的纬度。如果仅仅定义各个纬度的实现类,那只要20个实现类就足够完成了。而当调用方需要这两个纬度的属性时,只需要多出一步组装的过程,这样看来是十分划算的了。重新定义Circle类
public class Circle implements Shape {
private Color color;
public Circle(Color color) {
this.color = color;
}
@Override
public void drawShape() {
System.out.println("Circle");
color.drawColor();
}
}
通过改变给Circle传入的Color实现类,Circle具备了绘制各种颜色图形的能力。这也就完成了桥接模式。
简单来讲,它就是将一个复杂的类,先分离成不同纬度的组成部分,使得各个纬度的变化互不影响,且各个纬度的实现类数量有限。然后各个纬度的成品交给调用方去组装,从而避免了使用继承时实现类爆炸的后果。
优点:
1、抽象和实现的分离
2、优秀的扩展能力,两纬度的变化修改变更较为简单
3、实现细节对客户透明,调用方知道了具体对象的创建过程
缺点
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。