适用环境:如果一个系统需要在构建的抽象化校色和具体化校色之间增加更多的灵活性,避免在两层次之间简历静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。抽象化校色和实现化校色可以以继承的方式独立拓展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化的角色和具体化的角色进行动态耦合。一个类存在两个或多个独立变化的维度,且这两个或多个维度都需要进行独立拓展。对于那些不希望使用继承或因为多层次继承导致系统类急剧增加的系统,桥接模式尤为适用。
实际运用:Java语言通过Java虚拟机实现了平台的无关性,虚拟机通过对底层平台指令集及数据类型等进行统一抽象,针对不同平台用不同的虚拟机进行实现,这样Java应用程序就可以编译成符合虚拟机范围的字节码文件,而在不同平台上都能够运行。这里的平台和应用程序就是两个独立变化的维度,所以使用桥接模式比较合适。
桥接模式用一种巧妙的方式处理继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承转接为动态的对象组合关系,使得系统更加灵活,并易于拓展,同时有效控制了系统中类的个数。
定义:将抽象部分与它的实现部分分离,使他们都可以独立的变化。又称为柄体模式或接口模式。
模式结构图:
对象介绍:
抽象类(Pen):用于定义抽象类的接口,它一般是抽象类而不是接口,其中定义了一个实现抽象类(Color)类型的对象并可以维护该对象,它与实现抽象类之间有关联关系,它可以包含抽象的业务方法,还可以包含具体的业务方法。
扩充抽象类(SmallPen、MiddlePen、BigPen):扩充由抽象类定义的接口,通常情况下它不再是抽象类而是具体类,它实现了在抽象类中定义的抽象业务方法,在扩充抽象类中可以调用在实现抽象类中定义的接口方法。
实现抽象类(也叫实现类接口,这里是指的Color):定义实现类的接口,这个接口不一定要与抽象类的接口完全一致,事实上这两个接口可以完全不同,一般地讲,实现抽象类接口仅提供基本操作,而抽象类定义的接口可能会做更多更复杂的操作。实现抽象类接口对这些基本操作进行了定义,而具体实现交给其子类。通过关联关系,在抽象类中不仅拥有自己的方法,还可以调用实现抽象类中定义的方法,使用关联关系来替代继承关系。
具体实现类(Red、Yello):实现实现抽象类接口并具体实现它,在不同的具体实现类中提供基本操作的不同实现,在程序运行时,具体实现类对象将替换其父类对象,提供给客户端具体的业务操作方法。
代码:
客户端:
package com.bridgepattern.hing;
public class Client {
public static void main(String[] args) {
Pen pen = new SmallPen();
Color color = (Red)XMLUtil.getBean();
pen.setColor(color);
pen.draw("一匹马");
}
}
抽象类:
package com.bridgepattern.hing;
public class Pen {
protected Color color;
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public void draw(String name) {
}
}
扩充抽象类:
package com.bridgepattern.hing;
public class SmallPen extends Pen {
public void draw(String name) {
color.bepaint("小号的笔", name);
}
}
package com.bridgepattern.hing;
public class MiddlePen extends Pen {
public void draw(String name) {
color.bepaint("中等大小的笔", name);
}
}
package com.bridgepattern.hing;
public class BigPen extends Pen {
public void draw(String name) {
color.bepaint("大号的笔", name);
}
}
实现类接口:
package com.bridgepattern.hing;
public interface Color {
public void bepaint(String penType, String name);
}
具体实现类:
package com.bridgepattern.hing;
public class Red implements Color {
@Override
public void bepaint(String penType, String name) {
System.out.println("用"+penType+"画出红色的"+name);
}
}
package com.bridgepattern.hing;
public class Yellow implements Color {
@Override
public void bepaint(String penType, String name) {
System.out.println("用"+penType+"画出黄色的"+name);
}
}
总结:桥接模式对于几个对象和对象之间的关系的理解尤为重要,难点在于理解在这一模式中如何将类之间的继承关系转换为对象之间的组合,以及如何从现有类中提取出两个独立变化的维度以满足桥接模式的适用条件。