三分钟理解“桥接模式”——设计模式轻松掌握

什么是桥接模式?

将两个继承体系使用聚合/组合连接在一起,这就是桥接模式。

桥接模式的类图

桥接模式中,最大的特色就中两个继承体系中间的那座桥(聚合/组合)。

桥接模式中有两个继承体系,分别称为“抽象”和“实现”;

抽象类中持有实现类的引用,并且含有set函数用于给用户设置这个抽象类的实现;

当给抽象类的对象设置完实现类对象之后,用户就可以通过抽象类的对象访问实现类对象中的函数及变量了。

实际问题

请用继承体系表示以下事例:

老式手机由于操作系统不一致,因此不同厂家在生产完手机之后还得为该手机定制软件,也就是每个厂家生产的软件不能跨平台使用。

类图如下所示:

这种继承体系存在弊端:

此时如果要增加一种手机品牌,就还要为该品牌增加所有的软件类;

如果还要增加一种软件,就需要为所有品牌的手机增加新的软件类;

也就是说,目前这个继承体系的类分为两种类型,一种是手机品牌类,一种是手机软件类;不管增加哪种类型的类,都会导致要同时增加多个类,这样下去会导致继承体系过于庞大。

出现这种弊端的根本原因如下:

多种类别的类都存在于一个继承体系中,这样就会导致当增加一种功能时会相应增加多个类,而且有许多类之间功能大都相似。

解决办法:

将一个继承体系中的多种类型的类分成单独的继承体系,然后使用聚合/组合将这两个继承体系连接在一起。

这样当需要增加类时,由于新的类属于一个单独的继承体系,因此只需要在某一个继承体系中增加一个子类即可,从而避免了继承体系过于庞大的问题。

而这种将一个继承体系分成两个用组合/聚合方式连接的继承体系的方式就称为“合成/聚合复用原则”。

此时,如果需要增加一个类,只需要在一个继承体系中增加一个子类即可,无需增加好多类,从而继承体系不会异常庞大。

知识点扫盲——————————————————————————

什么是“合成/聚合复用原则”?

在程序设计时,应尽量使用合成/聚合,而尽量避免使用继承!

什么是“合成”与“聚合”?

聚合:在类A的成员变量中含有类B的对象的引用,但类B的成员变量中没有类A的对象的引用,则A和B的关系称为聚合,聚合是一种“弱拥有”的关系。

合成:在类A的成员变量中含有类B的对象的引用,但类B的成员变量中没有类A的对象的引用,并且A、B对象的生命周期必须一致,也就是类A的构造函数中要为成员变量B创建对象。因此,合成是一种强引用关系。

继承的缺点:

由于对象的继承关系是在编译时就定义好了,因此无法在运行时改变子类中从父类继承过来的实现。

并且子类的实现与父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类变化的发生。

当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。

这种依赖关系限制了灵活性,并最终限制了复用性。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员互动联盟

【答疑释惑第四十讲】前端工程师和程序猿有什么区别?

疑惑一 int *p,sizeof(p) 输出多少? ? 对于这个问题,我们知道,指针的大小和指针的类型相关,那么int 型指针的长度其实就是整形的长度。那...

3348
来自专栏静默虚空的博客

查找三 哈希表的查找

要点 哈希表和哈希函数 在记录的存储位置和它的关键字之间是建立一个确定的对应关系(映射函数),使每个关键字和一个存储位置能唯一对应。这个映射函数称为哈希函数,根...

3385
来自专栏程序人生

来来来,咱们元编程入个门

前一篇文章竟然被很多人批「干货太少」 —— 一看你们就没有看过 Rich 他老人家的 Hammock Driven Development(我很久前推荐过滴),...

33310
来自专栏灯塔大数据

干货 | 国外大神总结的10个Java编程技巧!

“任何可能出错的事情,最后都会出错。”这就是人们为什么喜欢进行“防错性程序设计”的原因。

1121
来自专栏java一日一条

提高代码质量:如何编写函数

函数是实现程序功能的最基本单位,每一个程序都是由一个个最基本的函数构成的。写好一个函数是提高程序代码质量最关键的一步。本文就函数的编写,从函数命名,代码分布,技...

1032
来自专栏程序人生

谈谈面向对象编程

最近写了些和函数式编程的文章,有读者和我讨论函数式编程和面向对象编程的优劣。二者都是很好的编程思想,都在着力解决代码重用的问题,也彼此吸收对方的优点,所以大可不...

42011
来自专栏java一日一条

提高代码质量:如何编写函数

函数是实现程序功能的最基本单位,每一个程序都是由一个个最基本的函数构成的。写好一个函数是提高程序代码质量最关键的一步。本文就函数的编写,从函数命名,代码分布,技...

552
来自专栏阿杜的世界

《Scala程序设计》阅读书摘

JVM上的语言越来越多了,从前几年的groovy、Scala和Clojure,现在又听说一门Kotlin。对于前三种语言,groovy算是JVM平台上的动态脚本...

862
来自专栏阿杜的世界

《Java 8实战》阅读笔记(1)

给方法listFiles传递方法引用**File::isHidden**

964
来自专栏漫漫深度学习路

tensorflow学习笔记(二十八):collection

tensorflow collection tensorflow的collection提供一个全局的存储机制,不会受到变量名生存空间的影响。一处保存,到处可取。...

3349

扫码关注云+社区