文章目录
桥接(Bridge)
将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。
通过组合的方式建立两个类之间联系,而不是继承。
适用场景:
- 抽象和具体实现之间增加更多的灵活性。
- 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
- 不希望使用继承,或因为多层继承导致系统类的个数剧增。
优缺点
优点:分离抽象部分及其具体实现部分;提高了系统的可扩展性;符合开闭原则与合成复用原则。
缺点:增加了系统的设计难度;需要正确地识别出系统中两个独立变化的维度。
应用场景
画图时可以画正方形、长方形、圆形三种形状,而每种形状又可以画白色、灰色、黑色三种颜色,因此我们可以很自然地想出以下的继承关系:
对于这种方案,假如我们要添加一个椭圆形状,我们又要增加三种颜色,也就是白椭圆、灰椭圆和黑椭圆。假如我们要添加一个绿色,我们就要增加绿正方形、绿椭圆和绿长方形。每次增加都会增加若干个类(如果增加颜色则会增加形状个数个类,若增加形状则会增加颜色个数个类),这会导致系统类的个数剧增,且不利于系统的扩展。
对于这种有几个变化维度的场景,我们就可以使用桥接模式来减少系统中的类个数。这里提供两个父类一个是颜色、一个形状,颜色父类和形状父类两个类都包含了相应的子类,然后根据需要对颜色和形状进行组合:
形状抽象类,将颜色接口设为其成员变量:
public abstract class Shape {
Color color;
public void setColor(Color color) {
this.color = color;
}
public abstract void draw();
}
具体形状类:
public class Circle extends Shape{
public void draw() {
color.bepaint("圆形");
}
}
public class Rectangle extends Shape{
public void draw() {
color.bepaint("长方形");
}
}
public class Square extends Shape{
public void draw() {
color.bepaint("正方形");
}
}
颜色接口:
public interface Color {
public void bepaint(String shape);
}
具体颜色类:
public class White implements Color{
public void bepaint(String shape) {
System.out.println("白色的" + shape);
}
}
public class Gray implements Color{
public void bepaint(String shape) {
System.out.println("灰色的" + shape);
}
}
public class Black implements Color{
public void bepaint(String shape) {
System.out.println("黑色的" + shape);
}
}
客户端类:
public class Test{
public static void main(String[] args) {
//白色
Color white = new White();
//正方形
Shape square = new Square();
//白色的正方形
square.setColor(white);
square.draw();
//长方形
Shape rectange = new Rectangle();
rectange.setColor(white);
rectange.draw();
}
}
这里在实现时要注意,抽象类的方法要调用组合的实现类的方法(如类Square
中的color.bepaint("正方形")
这行代码),这样才能体现出桥接的意义。
JDBC的应用
jdbc的类族设计是由sun公司设计了一套接口,再由各个数据库公司实现接口,我们在调用的过程中只需要使用接口去定义,然后在加载Driver的过程中底层代码会给我们选择好接口真正的实现类,以此来实现真正的数据库连接,此后所有的方法,包括获取statement等等,都是由接口声明调用,但是底层返回的是接口实现类。用这种桥接的模式,我们可以很轻松地在不同的数据库连接中进行转化,只需要修改Driver加载的类,如果把加载类的声明放入配置文件中,更是不需要重新去编译,可以很方便地在不同数据库间进行转化。
参考资料
- 弗里曼. Head First 设计模式 [M]. 中国电力出版社, 2007.
- 慕课网java设计模式精讲 Debug 方式+内存分析
- 设计模式读书笔记–桥接模式
- JDBC源码分析&桥接模式