JAVA 设计模式 桥接模式

用途

桥接模式 (Bridge)

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

桥接模式是一种结构式模式

结构

图-桥接模式结构图

Implementor : 定义实现接口

interface Implementor {
 // 实现抽象部分需要的某些具体功能
  public void operationImpl();
 }

Abstraction : 定义抽象接口

abstract class Abstraction {
 // 持有一个 Implementor 对象,形成聚合关系
  protected Implementor implementor;
 
 public Abstraction(Implementor implementor) {
 this.implementor = implementor;
     }
 
 // 可能需要转调实现部分的具体实现
  public void operation() {
         implementor.operationImpl();
     }
 }

ConcreteImplementor :  实现 Implementor 中定义的接口。

class ConcreteImplementorA implements Implementor {
     @Override
 public void operationImpl() {
 // 真正的实现
         System.out.println("具体实现A");
     }    
 }
 
 class ConcreteImplementorB implements Implementor {
     @Override
 public void operationImpl() {
 // 真正的实现
         System.out.println("具体实现B");
     }    
 }

RefinedAbstraction : 扩展 Abstraction 类。

class RefinedAbstraction extends Abstraction {
 
 public RefinedAbstraction(Implementor implementor) {
 super(implementor);
     }
 
 public void otherOperation() {
 // 实现一定的功能,可能会使用具体实现部分的实现方法,
 // 但是本方法更大的可能是使用 Abstraction 中定义的方法,
 // 通过组合使用 Abstraction 中定义的方法来完成更多的功能。
     }
 }

测试代码

public class BridgePattern {
 public static void main(String[] args) {
         Implementor implementor = new ConcreteImplementorA();
         RefinedAbstraction abstraction = new RefinedAbstraction(implementor);
         abstraction.operation();
         abstraction.otherOperation();
     }
 }

运行结果

具体实现A
其他操作

应用场景

1、如果你不希望在抽象和实现部分采用固定的绑定关系,可以采用桥接模式,来把抽象和实现部分分开,

然后在程序运行期间来动态的设置抽象部分需要用到的具体的实现,还可以动态切换具体的实现。 2、如果出现抽象部分和实现部分都应该可以扩展的情况,可以采用桥接模式,让抽象部分和实现部分可以

独立的变化,从而可以灵活的进行单独扩展,而不是搅在一起,扩展一边会影响到另一边。 3、如果希望实现部分的修改,不会对客户产生影响,可以采用桥接模式,客户是面向抽象的接口在运行,

实现部分的修改,可以独立于抽象部分,也就不会对客户产生影响了,也可以说对客户是透明的。 4、如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变

化的原因,看看是否能分离成不同的纬度,然后通过桥接模式来分离它们,从而减少子类的数目。

要点

如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。 抽象化角色和具体化角色都应该可以被子类扩展。在这种情况下,桥接模式可以灵活地组合不同的抽象化角色和具体化角色,并独立化地扩展。 设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。

推荐

本文属于 JAVA设计模式系列

参考资料

《大话设计模式》《HeadFirst设计模式》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏积累沉淀

strom架构和构建Topology

1.Hadoop的MapReduce与Storm的topology有什么不一样的地方? 2.Nimbus与hadoop的jobtracer作用是否类似? ...

24570
来自专栏日常学python

为什么 Python 这么慢?

对于一个类似的程序,Python 要比其它语言慢 2 到 10 倍不等,这其中的原因是什么?又有没有改善的方法呢?

22220
来自专栏小樱的经验随笔

CTF---Web入门第十一题 PHP大法

PHP大法分值:20 来源: DUTCTF 难度:中 参与人数:8205人 Get Flag:2923人 答题人数:3042人 解题通过率:96% 注意备份文件...

501110
来自专栏take time, save time

[细节决定B度]之回首一瞥cout<<"Hello,world"<<endl;

     都说细节决定成败,我觉得的编程来说,特别是面试的时候细节最能决定的是关键时候你能装的程度,所以我想有个系列记录我遇到的各种我遇到的细节问题,以备不时之...

37470
来自专栏向治洪

Android热修复技术总结

插件化和热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高级开发中必须掌握的技能,插件化的知识可以查我我之前的介绍:Android插件化。本...

32660
来自专栏沈唁志

PSR-各个框架遵循的统一编码规范现代PHPer的开发规范

19820
来自专栏老九学堂

【新手必读】Java初学者,你遇到的问题都在这了

很多小伙伴初次接触Java时往往会感觉十分迷茫,在这里老九君收集并解答了同学们遇到的一些基础问题,希望能对大家的Java学习之路有所帮助。 初识篇 1、什么是J...

41160
来自专栏Python小屋

Python批量检查网页是否被注入其他页面

代码思路:对于给定的文件夹中所有网页文件,读取其内容,然后使用正则表达式检查该文件中是否包含iframe框架,如果有的话就返回文件名和iframe代码,表示是一...

360110
来自专栏美团技术团队

Android插件化、热补丁中绕不开的ProGuard的坑

28560
来自专栏Ldpe2G的个人博客

ScalaMP ---- 模仿 OpenMp 的一个简单并行计算框架

12530

扫码关注云+社区

领取腾讯云代金券