定义:将抽象部分与实现部分分离,使他们都可以独立的进行变化
结构:
- 抽象部分:抽象类,保持一个对实现部分对象的引用,抽象部分中的方法需要调用实现部分的对象来实现
- 优化抽象部分:抽象部分的具体实现,对抽象部分的方法进行完善和扩展
- 实现部分:接口或者抽象类,由实现部分提供基本的操作,抽象部分的定义基于实现部分这些基本操作的业务方法
- 具体实现部分:完善实现部分中方法定义的具体逻辑
适用场景:
- 需要跨越多个平台的图形和窗口系统
- 一个类存在两个独立变化的维度,且两个维度都需要进行扩展
- 设计要求实现化角色的任何改变不应当影响客户端,或者实现化角色的改变对客户端是完全透明的
- 如果一个系统需要在构件的抽化角色和具体化角色之间添加更多的灵活性,避免在两个层次之间建立静态的联系
UML:
下面就是桥接模式的编码实现,这里以毛笔绘图为例子:
Implementor(颜色):
public interface Color {
void setColor();
}
public class Green implements Color{
@Override
public void setColor() {
System.out.println("给画上绿色");
}
}
public class Red implements Color{
@Override
public void setColor() {
System.out.println("给画上红色");
}
}
public class Blue implements Color{
@Override
public void setColor() {
System.out.println("给画上蓝色");
}
}
Abstraction(毛笔):
public abstract class Brush {
Color color;
public Brush(Color color){
this.color = color;
}
public void draw(){
color.setColor();
}
}
public class FineBrush extends Brush{
public FineBrush(Color color) {
super(color);
}
public void draw(){
System.out.println("用细毛笔画了一幅画");
super.draw();
}
}
public class ThickBrush extends Brush{
public ThickBrush(Color color) {
super(color);
}
public void draw(){
System.out.println("用粗毛笔画了一幅画");
super.draw();
}
}
Test:
public class Test {
public static void main(String[] args){
Color color = new Red();
Brush brush = new FineBrush(color);
brush.draw();
}
}
总结:
桥接模式在开发中的许多场景都可以运用,但真正用的并不多,因为对于抽象与实现的分离很难把握,是不是需要分离、该如何分离!对设计者来说要有一个恰到好处的分寸。桥接模式的优缺点如下:
优点:
- 分离抽象与实现
- 灵活的扩展
- 实现对客户是透明的
缺点:不容易设计,对开发者要求有一定的经验
参考:《Android源码设计模式与解析》