一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
桥接模式
定义
在GoF的《设计模式》一书中,桥接模式被定义为:将抽象和实现解耦,让它们可以独立变化。
还有另外一种更加简单的理解方式:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。
第二条说的基本算是对桥接模式定义的更通俗的理解。但还不是很清楚,不知道怎么用。举个简单例子:奶茶我们都经常喝,它有特大杯、大杯、中杯和小杯等各容量的,但还有很多口味:草莓、葡萄养乐多、百香果、凤梨毛峰等等,不仅如此,还有很多其他配料,如是否多糖、标准糖、是否加冰还是常温。容量、口味、配料可以理解为不同维度。至于抽象和实现的解耦,就是不同维度间的解耦。对于一个对象是由可以拓展的多维度组合而成,桥接模式就很有用了。
优点
-
解耦:不同维度间有效解耦了。使用对象间的关联关系解耦了抽象和实现(不同维度)之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化
-
取代继承。Java中多层继承方案违背了单一职责原则,复用性较差,且类的个数非常多。桥接模式是比多层继承方案更好的解决方法,它极大地减少了子类的个数
-
扩展性。提高了系统的可扩展性。在两个变化维度中任意扩展一个维度,都不需要修改原有系统,符合开闭原则
缺点
-
不容易理解。桥接模式的使用会增加系统的理解与设计难度。由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计与编程
-
多维度划分困难。桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性,如何正确识别两个独立维度也需要一定的经验积累
使用场景
-
如果一个系统需要在抽象类和具体类之间增加更多的灵活性和可扩展性,避免在两个维度之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系
-
一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展
-
对于那些不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用