设计模式之桥接模式(Bridge Pattern)

1.概念

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

理解

这里,我们用一个例子,来说明抽象化和实例化解耦的意思。
我们需要不同的形状,如圆形,三角形,长方形,正方形等等。每个形状,我们还需要多种颜色,如红色圆形,黑色圆形,灰色圆形,红、黑、灰三角形。。。。。。下面我们看两种实现方式。

方式一:
在这里插入图片描述
这种实现方式,就是创建每个图形,然后每个图形下面,再加上各种颜色的图形。相当于是每个图形,都把每个颜色,去实现一遍。

方式二:

在这里插入图片描述
这种方式,就是把抽象和实现脱离了。把图形和颜色,进行了抽象,把实现图形和颜色的组合,放在了最底层,由调用者去实现。最底层的颜色+图形,就相当于是一个桥梁,把图形和颜色,连接在了一起。这就是桥接模式。当图形发生变化时,我们改变图形抽象就行,当颜色发生变化时,我们改变颜色抽象就行,其中还有可能要建立一下新元素的桥梁,但是不用修改另一个抽象的代码。这样,就实现了两个抽象元素的解耦。

由此可见,两个或多个因素共同影响一个产品时,我们可以考虑使用桥接模式进行设计。其中的核心就是这个桥,它把多个因素,连接了起来。对于使用者而言,使用桥即可。

2.涉及到的角色

Abstraction:抽象类。
RefinedAbstraction:扩充抽象类。
Implementor:实现类接口。
ConcreteImplementor:具体实现类 。

这里,我们也需要进行一番解释。
我们上面提到,多因素的场景,考虑用桥接模式来连接。所以,在桥接模式中,有两个抽象类,代表两个因素的产品。还需要有一个桥,来连接两个因素。一般的,我们选择其中的一个因素的抽象类当作桥,来连接另一个因素。
上面的角色中,实现类接口就是一个因素的抽象。具体实现类,就是这个抽象因素的实现。抽象类是另一个因素的抽象,同时也是桥。所以在抽象类中,会引入另一个因素的属性,来连接另一个因素。扩充抽象类,就是桥抽象因素的实现。之所以叫扩充抽象类,是因为它在实现因素抽象的同时,还要连接另一个因素,融合另一个因素。

3.代码实现

下面,我们用桥接模式,来实现上面的那个案例。
首先,有两个因素,一个是形状,一个是颜色。我们以形状为桥。
我们先定义实现类接口,即颜色的抽象。

public interface Color {
    //涂色
    public void bepaint(String shape);
}

然后,我们定义颜色抽象的实现,

public class Red implements Color {
    @Override
    public void bepaint(String shape) {
        System.out.println("红色的"+shape);
    }
}

public class White implements Color {
    @Override
    public void bepaint(String shape) {
        System.out.println("白色的"+shape);

    }
}

然后,我们开始定义形状的抽象,也是桥。这是桥接模式的重点。桥里,会引入另一个因素,也就是会引入Color。

public abstract class Shape {
    //连接到color因素
    Color color;
    public void setColor(Color color) {
        this.color = color;
    }

    //Shape抽象的本职,就是画图形
    public abstract void draw();
}

最后,我们定义扩充抽象类,实现抽象方法,并使用另一个因素。

public class Circle extends Shape {

    //这就是实现,将两个因素组合起来的实现
    @Override
    public void draw() {
       color.bepaint("正方形");
    }
}

我们使用桥接模式时,进行手动组合,动态生成各种颜色的形状即可。

public class Client {
    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();
    }
}

4.与适配器模式的比较

在适配器模式中,我们实现一个抽象的方法,需要引入一个第三方的类, 来协助实现抽象方法。在桥接模式中,桥的抽象中,引入另一个因素的抽象,然后将两个因素融合起来。这两个模式有一些异曲同工之处。两者的区别是,适配器模式,引入的第三方是为实现方法而服务的,是来协助实现抽象方法的。而桥接模式,是两个相关联的因素,相互作用,产生结果。两者的思想,是不一样的。

5.优点与缺点

优点
1、分离抽象接口及其实现部分。提高了比继承更好的解决方案。
2、桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
3、实现细节对客户透明,可以对用户隐藏实现细节。
缺点
1、桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
2、桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的小小酥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值