桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
**将抽象部分与实现部分分离,使它们都可以独立的变化。————《设计模式》GOF **
在桥接模式中将抽象部分和实现部分分离,主要由四大类角色组成:
- Implementor(抽象接口):该接口定义了提供了模块的基本操作,抽象出来类别的核心接口,然后交由具体类进行实现核心接口;
- ConcreateImplementor(具体实现类):该类主要是将Implementor接口进行差异化实现,针对接口提供不同的实现,在具体运行中,用来替换抽象接口,调用具体的实现;
- AbstractBridge(抽象类):这个就是桥接模式的核心部分,它是一个冲向类充当桥梁作用,它包含一个Implementor的实例,然后可以定义自身多样性的方法,它即可以包含抽象业务方法,也可以包含具体业务方法;
- RedefinedBridge(扩充类):它是抽象桥梁类的具体实现,可以根据需求定义不同的实现。
UML图
场景演示
在绘制板模块中,需要绘制图形,图形绘制又分为绘制圆形、绘制矩形。绘制的图形又会有颜色、大小的区分。
以继承的关系去实现现在的一个逻辑的UML
通过上面的UML图,可以看出。这样设计的继承层级太多,耦合度也非常高,比如现在我们需要增加宽度、绘制椭圆形等需求,这个改动量非常大,伸展性不好。
采用桥接模式动态配置UML
代码实现
抽象核心接口以及实现
/**
* 抽象出最核心的方法
* @author Iflytek_dsw
*
*/
interface DrawApi {
public void drawApi();
}
/**
* 绘制圆形
* @author Iflytek_dsw
*
*/
class DrawCircle implements DrawApi{
@Override
public void drawApi() {
System.out.println("绘制圆形");
}
}
/**
* 绘制矩形
* @author Iflytek_dsw
*
*/
class DrawRectangle implements DrawApi{
@Override
public void drawApi() {
System.out.println("绘制矩形");
}
}
桥接类和对应的实现
/**
* 通过组合的关系,建立一个桥接
* @author Iflytek_dsw
*
*/
abstract class DrawApiBridge {
private DrawApi drawApi;
public DrawApiBridge(DrawApi drawApi) {
super();
this.drawApi = drawApi;
}
public void color(){
drawApi.drawApi();
}
}
class DrawRed extends DrawApiBridge{
public DrawRed(DrawApi drawApi) {
super(drawApi);
}
@Override
public void color() {
super.color();
System.out.println("绘制红色");
}
}
class DrawBlue extends DrawApiBridge{
public DrawBlue(DrawApi drawApi) {
super(drawApi);
}
@Override
public void color() {
super.color();
System.out.println("绘制蓝色");
}
}
客户端使用
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
/**
* 绘制红色圆
*/
DrawApi drawApi = new DrawCircle();
DrawRed drawRed = new DrawRed(drawApi);
drawRed.color();
/**
* 绘制绿色矩形
*/
DrawApi drawApi2 = new DrawRectangle();
DrawBlue drawBlue = new DrawBlue(drawApi2);
drawBlue.color();
}
}
这样实现起来继承关系简单了很多,降低层级。我们扩展绘制椭圆形、新增大小等属性都是很方便。
总结
根据上面的体验,在桥接模式中,将核心的部分抽取出来作为抽象接口,将这些多维度变化的信息抽象成桥接的实现类别,通过桥与接口的组合进行降维度处理以便达到降低耦合的效果。