桥接模式
桥接(Bridge Pattern)将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度,这种类型的设计模式属于结构型模式。
桥接模式解决的问题
将抽象部分与实现部分分离,使它们都可以独立的变化。实现系统可能有多个角度分类,每一种角度都可能变化。
桥接模式模式角色
抽象类(Abstraction):抽象类接口,维护队行为实现(implementation)的引用。
抽象扩展(Refined Abstraction):是抽象类的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化接口(Implementor):定义实现化角色的接口,供扩展抽象化角色调用。
具体实现(Concrete Implementor):给出实现化角色接口的具体实现。
使用场景
如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
桥接模式和策略模式的区别
桥接模式
策略模式
形式上的不同
两者还是有一定区别的,对比两幅结构图,我们可以发现,在桥接模式中不仅Implementor具有变化
(ConcreateImplementior),而且Abstraction也可以发生变化(RefinedAbstraction),而且两者的变化
是完全独立的,RefinedAbstraction与ConcreateImplementior之间松散耦合,它们仅仅通过Abstraction与
Implementor之间的关系联系起来。而在策略模式中,并不考虑Context的变化,只有算法的可替代性。
语意上的不同
桥接模式强调Implementor接口仅提供基本操作,而Abstraction则基于这些基本操作定义更高层次的操作。而策略模式强调 Strategy抽象接口的提供的是一种算法,一般是无状态、无数据的,而Context则简单调用这些算法完成其操作。
策略模式,桥接模式要表达的内容要更多,结构也更加复杂。
代码实现
运行结果:
优缺点
优点:抽象和实现的分离,优秀的扩展能力,实现细节对客户透明。
缺点:由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,这增加了系统的理解与设计难度。
生活中的桥接模式
手机有很多不同的app,有购物、社交、音乐、视频、地图等等,每一款app都是一种算法实现,app属于被调用者,手机作为调用者,又分很多种,有iphone、华为、小米、锤子等,这种场景可以使用桥接模式,实现调用者和被调用者分离。
汽车有很多零件,有轮胎、发动机、座椅、方向盘,汽车又分很多品牌,有保时捷、特斯拉、奔驰、宝马等,这种场景也同样适用于桥接模式。
我的启发
策略模式是对算法的抽象,调用者可以根据不同的情况,自主选择不同的算法实现。桥接模式是策略模式的升级版,不仅对算法实现进行抽象,对于调用者也进行抽象,让系统扩性更好,更灵活。世界没有免费的午餐,灵活性变高了,但是复杂性也变高了,对程序员的要求也更高。
设计模式系列文章历史
java设计模式之原型模式,本故事纯属虚构,如有雷同,纯属巧合
java设计模式之桥接模式,策略模式旗舰版,世界没有免费的午餐
Head First 设计模式之装饰器模式,因为参与,所以认同
Head First 设计模式之观察者模式,你我都是发布者和订阅者
Head first 设计模式之策略模式,来源于生活,用之于生活
java经典书单:
网友评论