桥接模式(Bridge)
1、概念
桥接模式将抽象部分与它的实现部分分离,使它们都可以独立地变化,属于结构性模式的一种。
2、模式结构
- Abstraction(抽象类):定义抽象接口,拥有一个Implementor类型的对象引用,它与 Implementor 之间具有关联关系
- RefinedAbstraction(扩充抽象类):扩展Abstraction中的接口定义,实现了在 Abstraction 中声明的抽象业务方法
- Implementor(实现类接口):是具体实现的接口,Implementor和RefinedAbstraction接口并不一定完全一致,实际上这两个接口可以完全不一样Implementor提供具体操作方法,而Abstraction提供更高层次的调用
- ConcreteImplementor(具体实现类):具体实现 Implementor 接口,在不同的 ConcreteImplementor 中提供基本操作的不同实现
3、使用场景
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
- 设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
- 一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态耦合。
- 虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
4、优缺点
优点:
- 分离抽象接口及其实现部分
- 提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统
- 实现细节对客户透明,可以对用户隐藏实现细节
缺点:
- 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程
5、实例
项目中,经常会遇到画圆角的需求,例如在正方形和矩形画圆角,首先,需要定义一个画图接口
public interface IDrawing {
void drawFillet(Bitmap bitmap, int radius);
}
正方形和矩形的具体实现
public class RectFillet implements IDrawing {//矩形
@Override
public void drawFillet(Bitmap bitmap, int radius) {
}
}
public class SquareFillet implements IDrawing {//正方形
@Override
public void drawFillet(Bitmap bitmap, int radius) {
}
}
定义画图的抽象类,持有画图的api
public abstract class Shape {
protected IDrawing drawing;
protected Shape(IDrawing drawing) {
this.drawing = drawing;
}
public abstract void draw();
}
实现画图抽象类
public class Fillet extends Shape {
private int radius;
private Bitmap bitmap;
public Fillet(IDrawing drawing, Bitmap bitmap, int radius) {
super(drawing);
this.bitmap = bitmap;
this.radius = radius;
}
@Override
public void draw() {
drawing.drawFillet(bitmap, radius);
}
}
客户端使用
public static void main(String[] args) {
Bitmap bitmap = BitmapFactory.decodeFile("");
Shape rect = new Fillet(new RectFillet(), bitmap, 10);
Shape square = new Fillet(new SquareFillet(), bitmap, 10);
rect.draw();
square.draw();
}