设计模式-桥接模式Bridge Pattern:爱虽放手,牵挂不减

概念

桥接模式(Bridge Pattern)是设计模式中最复杂的模式之一,它把事物对象和该对象的具体行为、具体特征分离开来,使它们可以独自进行变化和更改。这样的解释可能比较抽象和令人费解,读者可以通过下面的应用场景进一步来理解。

应用场景

我们还以绘制图形为例,比如我们要绘制矩形Rectangle、Circle、Triangle,我们需要至少需要定义3个形状类来表示,如果我们要绘制的图形还有不同的颜色,如Red、Yello、Green等,此时我们可能有一下两种设计方案:
1. 为每个形状类都提供颜色的实现,比如通过继承增加RedRectangle、YellowRectangle、RedCircle、YellowCircle等
2. 根据实际需要对具体形状对象和颜色属性进行组合,把颜色属性作为参数动态给到形状对象来使用,比如红色的圆形就是组合 Circle + RedAttr

如果一个有两个及以上的变化维度的系统(或对象),采用方案2可以明显减少类的维护个数,扩展起来更为方便。方案2即为桥接模式的应用,它使用组合关联关系,而不是通过继承来做扩展,这减少了类之间的耦合,减少代码的编写量。

用过Java Swing进行过图形界面开发的读者发现,界面的风格(Look and Feel)在不同操作系统下是不一样的,实际上Java为每一个GUI组件都提供了一个Peer构件,该构件在不同操作系统下有不同的实现,Swing的Peer架构就是应用了桥接模式。

在以下情况下我们可以尝试使用桥接模式:

一个类存在两个独立变化的维度,且这两个维度都需要独立扩展,这样有利于开发者单独去维护维度的扩展,而不需要关注其他维度的实现
继承,尤其是多层次的继承会使得类的个数和理解复杂度都急剧增加,此时桥接模式尤为适用


模式结构

设计模式-桥接模式Bridge Pattern:爱虽放手,牵挂不减_第1张图片

结构桥接模式包含以下角色:
/ Abstraction:抽象类
/ RefinedAbstraction:扩充抽象类
/ Implementor:扩展行为或属性的接口定义(这里需要特别注意,这是Abstraction的行为或特征的实现类接口,翻译后确实词不达意)
/ ConcreteImplementor:Implementor的具体实现类

桥接模式就是将Abstraction的一些行为或属性独立的再抽象到Implementor中,在 Abstraction(或RefinedAbstraction)中通过组合来动态的将Implementor的实现ConcreteImplementor组合起来,而不是用典型的继承关系来做扩展。这样就实现了一个对象(或系统)跟它的行为(或属性)能够通过不同的类单独去扩展和变化,再通过引用关系组合起来,这就是所谓的桥接。

代码示例

设计模式-桥接模式Bridge Pattern:爱虽放手,牵挂不减_第2张图片

设计模式-桥接模式Bridge Pattern:爱虽放手,牵挂不减_第3张图片输出:
API1.circle at 1:2 7.5
API2.circle at 5:7 27.5

优缺点

优点:
/ 桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
/ 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
/ 实现细节对客户透明,可以对用户隐藏实现细节。


缺点:
/ 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
/ 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。


作业

最后,我们给读者留一个作业:我们需要开发一个跨平台的视频播放器,在不同操作系统平台(Windows、Linux、MacOS等)上,除了可以播放多种格式的视频文件(MPEG、RMVB、AVI、WMV等),还可以播放多种格式的音频文件(WAV、MP3、AAC、OGG等),该如何进行设计呢?

————————————————
版权声明:本文为CSDN博主「请给我一根烟的时间」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mytream/article/details/125023604

你可能感兴趣的:(设计模式,桥接模式)