结构型:桥接模式及相关应用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38283262/article/details/84241176


桥接(Bridge)

将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。

通过组合的方式建立两个类之间联系,而不是继承。

适用场景:

  • 抽象和具体实现之间增加更多的灵活性。
  • 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展。
  • 不希望使用继承,或因为多层继承导致系统类的个数剧增。

优缺点

优点:分离抽象部分及其具体实现部分;提高了系统的可扩展性;符合开闭原则与合成复用原则。

缺点:增加了系统的设计难度;需要正确地识别出系统中两个独立变化的维度。

应用场景

画图时可以画正方形、长方形、圆形三种形状,而每种形状又可以画白色、灰色、黑色三种颜色,因此我们可以很自然地想出以下的继承关系:

1

对于这种方案,假如我们要添加一个椭圆形状,我们又要增加三种颜色,也就是白椭圆、灰椭圆和黑椭圆。假如我们要添加一个绿色,我们就要增加绿正方形、绿椭圆和绿长方形。每次增加都会增加若干个类(如果增加颜色则会增加形状个数个类,若增加形状则会增加颜色个数个类),这会导致系统类的个数剧增,且不利于系统的扩展。

对于这种有几个变化维度的场景,我们就可以使用桥接模式来减少系统中的类个数。这里提供两个父类一个是颜色、一个形状,颜色父类和形状父类两个类都包含了相应的子类,然后根据需要对颜色和形状进行组合:

2

形状抽象类,将颜色接口设为其成员变量:


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加载的类,如果把加载类的声明放入配置文件中,更是不需要重新去编译,可以很方便地在不同数据库间进行转化。

参考资料

猜你喜欢

转载自blog.csdn.net/qq_38283262/article/details/84241176