这是本人学习Java23种设计模式期间总结和记录,主要听的课程是尚硅谷——韩顺平老师的课程,这个课程可谓是非常详细了,推荐学习。
桥接模式给我最大的印象就是将抽象类和实现类的分离,最后解决了类爆炸的问题。举个例子,一般来说,具体定位一台手机,需要手机类型还有手机品牌,两者共同定位一部手机,画个图看看:
每一个品牌都发布了不同类型屏幕的手机,但是如果要在这个基础上,从手机分类中增加一个屏下摄像头的类型,就要添加一个新的类型,然后每个类型下面继续添加不同的品牌,这样来说,保守估计都要新添加4个模块,如果将来还有更多的类型,那可能数量会暴增,所以,我们引入桥接模式,将两个大的维度给分开,分离抽象的接口和具体的实现,可以解决数量暴增的问题,示意图如下:
如图所示,将类型和品牌分开以后,如果未来想要添加一个新的类型,只需用添加类型模块就可以了,品牌还是原来的不变,即使有新品牌,也只用在右侧添加品牌即可,注意桥接模式和装饰者模式有个最根本的区别,就是桥接模式不够稳定,如果说新添加一个折叠屏的手机类型,小米华为都有,但是vivo没有,那么这个模式失效了,桥接前提就是品牌和类型有息息相关的连接,如果随意添加类型,都会有手机品牌对应,那思想就变成装饰者模式了
桥接模式实例代码如下:
public interface Brand { void open(); void close(); void call(); } public class Vivo implements Brand { @Override public void open() { System.out.println(" Vivo 手机开机 "); } @Override public void close() { System.out.println(" Vivo 手机关机 "); } @Override public void call() { System.out.println(" Vivo 手机打电话 "); } } public class XiaoMi implements Brand { @Override public void open() { System.out.println(" 小米手机开机 "); } @Override public void close() { System.out.println(" 小米手机关机 "); } @Override public void call() { System.out.println(" 小米手机打电话 "); } } public abstract class Phone { //组合品牌 private Brand brand; //构造器 public Phone(Brand brand) { super(); this.brand = brand; } protected void open() { this.brand.open(); } protected void close() { brand.close(); } protected void call() { brand.call(); } } public class UpRightPhone extends Phone { //构造器 public UpRightPhone(Brand brand) { super(brand); } public void open() { super.open(); System.out.println(" 直立样式手机 "); } public void close() { super.close(); System.out.println(" 直立样式手机 "); } public void call() { super.call(); System.out.println(" 直立样式手机 "); } } public class Client { public static void main(String[] args) { //获取折叠式手机 (样式 + 品牌 ) UpRightPhone phone3 = new UpRightPhone(new XiaoMi()); phone3.open(); phone3.call(); phone3.close(); System.out.println("=============="); UpRightPhone phone4 = new UpRightPhone(new Vivo()); phone4.open(); phone4.call(); 、 phone4.close(); } }桥接模式的注意事项和细节:
实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程桥接模式要求正确识别出系统中两个独立变化的维度(抽象、实现),因此其使用范围有一定的局限性,即需要有这样的应用场景。