1.定义
桥接模式是一种结构型模型,现实生活中桥就是连接在河两端方便通行的建筑。
而桥接模式则是对类的功能层次结构和类的实现层次结构中间实现的一个桥梁。
类的功能层次结构
所谓类的功能层次结构就是对类进行继承后进行的功能扩展,例如Car(车类),所有车都有启动和停止方法以及转弯等方法。但是现在我有一个特殊的车需要在Car车类的基础上加一个倒车影像功能,此时只需要继承Car类再自己的类中加一个倒车影像即可,此时就是类的功能层次结构。
类的实现层次结构
所谓类的实现层次结构就是只进行继承和对方法进行实现。而不新增。例如模板方法模式,在父类中定义方法而子类只需要去实现对应的方法即可,此时就是类的实现层次结构。
所当一个类中不仅存在类的功能层次结构还存在类的实现层次结构的时候,这个类会变得很复杂。
假如有一个汽车类,然后有三个品牌分别是宝马、奥迪、奔驰,而每一个品牌又有三种车分别是跑车、轿车、suv;同时他们的关系都是通过继承来实现的,此时可以看到当需要新增一个类的品牌的时候需要新增多个子类,必须新增捷豹,此时也需要新增跑车、轿车、suv,而新增一个皮卡车的时候可能也需要在奔驰、宝马、奥迪中新增子类。此时你会发现这样处理,类多的有点爆炸了。
同时汽车中的类不仅存在类的功能层次结构而且存在类的实现层次结构,这样非常的复杂。
2.桥接结构图
Brand为品牌的抽象,所有品牌都应该对Brand进行实现,Audi则是具体的品牌,同时扮演实现者的角色,是对具体品牌以及具体品牌的功能实现(打印品牌信息),Car扮演抽象化角色,其中包含了对品牌的桥接,而SportsCar则是扮演改善后的抽象化,也就是跑车,拥有自己独立的功能打开敞篷。
3.桥接模式实现
Brand接口是品牌类,其中info方法用于展示品牌信息。
BMW是宝马类,实现Brand接口,同时打印自己的品牌信息。
Audi是宝马类,实现Brand接口,同时也打印自己的品牌信息。
Car是抽象类,其中引用了Brand品牌,每一个汽车出厂都应该自带自己的品牌,同时调用info打印品牌信息。
SportsCar继承Car类表示跑车,打印跑车信息以及调用父类的汽车品牌信息,同时拥有自己的方法开启敞篷,此时可以看到SportsCar增加了convertible方法,也就是类的功能层次结构,同时重写了info也就是类的实现层次结构。
到此整个桥接模式完毕,使用Test进行测试,可以看到此时不再使用继承,而是使用组合的方法,需要什么品牌以及什么样的汽车都可以通过组合,且可以增加独有的方法,例如跑车的开启敞篷。
桥接模式优缺点
优点:
1.实现了抽象和实现部分的分离 桥接模式分离了抽象部分和实现部分,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来。
2.更好的可扩展性 由于桥接模式把抽象部分和实现部分分离了,分别定义接口,这有助于系统进行分层设计,从而产生更好的结构化系统。对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了。
3.更好的可扩展性
缺点:
1.桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
2.桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。