设计模式-桥接模式

设计模式-桥接模式

定义

桥接模式(Bridge Pattern)也称为桥梁模式接口(Interface)模式柄体(Handle and Body)模式,是将抽象部分和它的具体实现部分分离,使它们都可以独立变化.

通过组合的方式建立连个类之间的联系,而不是继承.但又类似于多重继承方案,但是多重继承方案往往违背了类的单一职责原则,其复用性比较差,桥接模式是比多重继承更好的替代方案.桥接模式的核心在于解耦抽象和实现.

属于结构型设计模式.

桥接模式类图UML

从UML类图中我们可以看到,桥接模式主要包含4种角色:

1、抽象(Abstraction):该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现.抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);

2、修正抽象(RefinedAbstraction):Abstraction的具体实现,对Abstraction的方法进行完善和扩展;

3、实现(Implementor):确定实现维度的基本操作,提供给Abstraction使用.该类一般为接口或抽象类;

4、具体实现(ConcreteImplementor):Implementor的具体实现.

代码实例

举个例子,我们平时办公的时候经常通过发邮件消息、短信消息或者系统内消息和同事进行沟通.尤其是在走一些审批流程的时候,我们需要记录这些过程以备查.我们根据消息类别来划分的话,可以分为邮件消息、短信信息和系统内消息.但是,根据消息的紧急程度来划分的话,可以分为普通消息、紧急消息和特级消息.显然,整个消息系统可以划分为两个维度.

如果,我们用继承的话情况就复杂啦,而且也不利于扩展.邮件信息可以是普通的,也可以是紧急的;短信消息可以是普通的,也可以是紧急的.看代码:

创建IMessage接口担任桥接的角色
邮件信息实现类
手机短信实现类
桥接抽象消息类
具体实现普通消息
具体实现紧急消息
测试代码
运行结果

上面的案例中,我们采用桥接模式解耦了“消息类型”和“消息紧急程度”这两个独立变化的维度.后续如果有更多的消息类型,不如微信、钉钉等,那么直接新建一个类继承IMessage即可;如果是紧急程度需要新增,那么同样只需新建一个类实现AbstractMessage类即可.UML图如下:

UML类图

桥接模式在源码中的应用

大家非常熟悉的JDBC API,其中有一个Driver类就是桥接对象.我们都知道,我们在使用的时候通过Class.forName()方法可以动态加载各个数据库厂商实现的Driver类.具体客户端应用代码如下,

以MySQL的实现为例:

MySQL具体实现类

首先,我们来看一下Driver接口的定义:

Driver接口

Driver在JDBC中并没有做任何实现,具体的功能实现由各厂商完成,我们以MySQL的实现为例.

Mysql的实现

当我们执行Class.forName("com.mysql.jdbc.Driver")方法的时候,就会执行com.mysql.jdbc.Driver这个类的静态块中的代码.而静态块中的代码只是调用了一下DriverManager的registerDriver()方法,然后将Driver对象注册到DriverManager中.我们可以继续跟进到DriverManager这个类中,来看相关代码:

DriverManager类

在注册之前,将转过来的Driver对象,封装成一个DriverInfo对象.接下来继续执行客户端代码的第二步,调用DriverManager的getConnection()方法获取连接对象,我们跟进源码:

getConnection()方法

在getConnection()方法中就又会调用各自厂商实现的Driver的connect()方法获得连接对象.这样的话,就巧妙的避开了使用继承,为不同的数据库提供了相同的接口.JDBC API中DriverManager就是桥,如下图所示:

JDBC API类图

适用场景

1、在抽象和具体实现之间需要增加更多的灵活性的场景.

2、一个类存在两个(或多个)独立变化的维度,而这两个(或多个)纬度都需要独立进行扩展.

3、不希望适用继承,或因为多层继承导致系统类的个数剧增.

优点

1、分离抽象部分及其具体实现部分;

2、提高了系统的扩展性;

3、符合开闭原则;

4、符合合成复用原则.

缺点

1、增加了系统的理解和设计难度;

2、需要正确地识别系统中两个独立变化的纬度.

桥接相关的设计模式

1、桥接模式和组合模式

2、桥接模式和适配器模式

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • 桥接模式 定义 抽象部分和具体实现部分分离 让他们可以独立的变化 通过组合的方式建立两个类之间的关系而不是继承 结...
    黄金时代的架构之路阅读 362评论 0 0
  • 桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型...
    _muggle阅读 234评论 0 0
  • 定义 将抽象部分与它的具体实现部分分离,使它们都可以独立的变化。(一定程度上解耦) 通过组合的方式建立两个类之间的...
    NealLemon阅读 449评论 0 4
  • 场景问题 发送消息 现在我们要实现这样一个功能:发送消息。从业务上看,消息又分成普通消息、加急消息和特急消息多种,...
    陈HHH阅读 464评论 0 0
  • @TOC 手机操作问题 现在对不同手机类型的不同品牌实现操作编程(比如 :开机、关机、上网、打电话等等),如图 :...
    小小一技术驿站阅读 458评论 0 0