概念
桥接模式:亦称Bridge模式,构造型设计模式之一。
将抽象部分(abstraction)和它的实现部分(implementor)分离,使这两部分能够独立的变化与扩展。
将继承关系转换为关联关系,降低了类与类之间的耦合,降低代码量。
UML
角色
- 抽象部分(Abstraction):该类保存一个对实现部分对象的引用。抽象部分的方法需要调用实现部分的对象来实现,一般为abstract类。
- 优化的抽象部分(RefinedAbstraction):抽象部分的具体实现,修正或完善抽象部分的方法
- 实现部分 (Implementor):可以为抽象类或接口,实现部分的方法不一定要与抽象部分方法一致。它提供的是底层的方法,供抽象部分定义的上层的业务方法进行调用。
- 具体实现的实现部分(ConcreteImplementorA/ConcreteImplementorB):实现部分的具体实现,可认为是实现部分中方法的具体实现
- 客户类(Client):桥接模式的具体使用者。
简单示例
最近手机摔了,破相了。无奈再换个新的吧,目前对性能没有太大的要求,就是需要能存储东西即可,性价比高当然更好了。选什么品牌呢?选多大的存储呢?这是个问题。这不就是可以用桥接模式么。
Implementor类:
实现部分(存储ROM)的抽象接口
package com.bamboolmc.designpattern.BridgeMode;
public interface ROM {
/**
* 配置ROM大小
*/
public void ConfigRom ();
}
ConcreteImplementor类:
实现部分(存储ROM)的具体实现(32G/64G)
package com.bamboolmc.designpattern.BridgeMode;
public class ROM_32 implements ROM {
@Override
public void ConfigRom() {
System.out.println("ROM配置了32G,只能存一些照片、电影");
}
}
package com.bamboolmc.designpattern.BridgeMode;
public class ROM_64 implements ROM{
@Override
public void ConfigRom() {
System.out.println("ROM配置了64G,能存放很多照片、电影");
}
}
Abstraction类:
抽象部分(Mobile)的抽象类
package com.bamboolmc.designpattern.BridgeMode;
public abstract class Mobile {
private ROM rom;
public Mobile(ROM rom) {
this.rom = rom;
}
public ROM getRom() {
return rom;
}
public void setRom(ROM rom) {
this.rom = rom;
}
public abstract void installROM();
}
Refined Abstraction类:
抽象部分(Mobile)的具体实现(Huawei/XiaoMi)
package com.bamboolmc.designpattern.BridgeMode;
public class HuaWei extends Mobile{
public HuaWei(ROM rom) {
super(rom);
}
@Override
public void installROM() {
System.out.println("HuaWei mobile:");
this.getRom().ConfigRom();
}
}
package com.bamboolmc.designpattern.BridgeMode;
public class XiaoMi extends Mobile{
public XiaoMi(ROM rom) {
super(rom);
}
@Override
public void installROM() {
System.out.println("XiaoMi mobile:");
this.getRom().ConfigRom();
}
}
Clicent类:
package com.bamboolmc.designpattern.BridgeMode;
public class BridgeClicent {
public static void main(String[] args){
ROM rom32g = new ROM_32();
Mobile huawei = new HuaWei(rom32g);
huawei.installROM();
ROM rom64g = new ROM_64();
Mobile xiaomi = new XiaoMi(rom64g);
xiaomi.installROM();
}
}
疑问
抽象部分和实现部分哪里进行了桥接?
抽象部分(Abstraction)保存一个对实现部分对象的引用,针对上述的示例,具体如下:
引用一:
抽象部分Mobile保存一个对实现部分ROM的引用
public abstract class Mobile {
private ROM rom;
public Mobile(ROM rom) {
this.rom = rom;
}
}
具体使用时实现:
public static void main(String[] args){
ROM rom32g = new ROM_32();
Mobile huawei = new HuaWei(rom32g);
}
适用环境
- 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
- 对于那些不希望使用继承,或者使用多层继承导致系统类个数急剧增长的系统。
- 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
优缺点
缺点
- 使用范围的局限性,要求能够正确识别独立变化的维度。
- 聚合关联关系在抽象层,增加了理解难度;要求开发者在抽象层中进行设计与编程,增加了设计难度。
优点
- 分离抽象部分与实现部分,耦合度更低。
- 提高系统可扩充性,维度任意变化,不影响原系统。
- 隐藏实现细节,实现细节对客户不透明。