桥接模式
介绍
桥接模式(Bridge Pattern),bridge的意思是“桥梁”,桥梁的功能是将河流的两侧连接起来。桥接模式的作用也是把抽象化与实现化解耦,使得二者可以独立变化,然后通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
引入问题
举一个我们生活中的例子。我们平时在家肯定离不开网络,电视、电脑、iPad等等都需要使用网络,而接入网络的方式又可以分为有线接入和无线wifi接入。按照一般的思维,我们会按照以下的方式来实现上述的功能:
这样的设计虽然可以实现功能,但是会导致系统非常的脆弱和不易维护。
1)会有大量重复的代码
2)类的结构层次过于复杂,继承关系太多,不易维护
3)扩展性比较差,如果只增加不同的上网设备还行,一旦又增加了一种新的网络接入方式,会导致系统类成倍的增加
而桥接模式的设计,就是为了解决在有多种可能会变化的情况下,用继承会造成类爆炸,扩展起来不灵活的问题。
桥接模式实现
我们改进下传统的实现方式:
桥接模式实现的示例程序如下:
Network类
public abstract class Network {
private Device device;
public Network(Device device) {
this.device = device;
}
public void surf() {
useNet();
device.surf();
}
public abstract void useNet();
}
Wireline类
public class Wireline extends Network {
public Wireline(Device device) {
super(device);
}
@Override
public void useNet() {
System.out.print("使用有线接入方式,");
}
}
Wireless类
public class Wireless extends Network {
public Wireless(Device device) {
super(device);
}
@Override
public void useNet() {
System.out.print("使用无线接入方式,");
}
}
Device类
public abstract class Device {
public abstract void surf();
}
TV类
public class TV extends Device {
@Override
public void surf() {
System.out.println("TV开始上网。");
}
}
PC类
public class PC extends Device {
@Override
public void surf() {
System.out.println("PC开始上网。");
}
}
IPad类
public class IPad extends Device {
@Override
public void surf() {
System.out.println("IPad开始上网。");
}
}
调用类(Main)
public class Main {
public static void main(String[] args) {
Device tv = new TV();
Device pc = new PC();
Device ipad = new IPad();
Network tvWireline = new Wireline(tv);
Network pcWireline = new Wireline(pc);
Network ipadWireline = new Wireline(ipad);
Network tvWireless = new Wireless(tv);
Network pcWireless = new Wireless(pc);
Network ipadWireless = new Wireless(ipad);
tvWireline.surf();
pcWireline.surf();
ipadWireline.surf();
tvWireless.surf();
pcWireless.surf();
ipadWireless.surf();
}
}
输出结果
使用有线接入方式,TV开始上网。
使用有线接入方式,PC开始上网。
使用有线接入方式,IPad开始上网。
使用无线接入方式,TV开始上网。
使用无线接入方式,PC开始上网。
使用无线接入方式,IPad开始上网。
桥接模式总结
优点
1)抽象和实现的分离,提供了比继承更好的实现方案。
2)可扩展性高
3)实现细节对客户透明
适用场景
1)如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
2)对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
3)一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。