桥接模式(Bridge)定义
桥接模式是一种结构型设计模式,它的核心目的是将抽象与实现解耦,使得两者可以独立地变化。在桥接模式中,抽象部分指的是某个类的接口,而实现部分则是这个接口的具体实现。这样,你可以在不改变抽象接口的前提下,改变实现部分。
桥接模式的应用场景
桥接模式适用于以下场景:
- 当你想避免一个抽象和它的实现之间的永久绑定时。例如,当实现必须可以在运行时切换或选择时。
- 类的抽象以及它们的实现都应该通过生成子类的方式来扩展。这时桥接模式让你可以对各自独立地进行扩展。
- 变化的抽象和实现应该能够独立地进行,这样一个客户端代码就可以对抽象进行操作,而不用关心实现细节。
代码示例
下面是一个简单的桥接模式的例子,其中包括一个设备(Device)接口和两种类型的设备实现(Radio和Tv),以及一个远程控制器(Remote)的抽象和两种不同的远程控制器实现(BasicRemote和AdvancedRemote)。
设备接口(Implementation):
// 设备接口
public interface Device {
boolean isEnabled();
void enable();
void disable();
int getVolume();
void setVolume(int volume);
int getChannel();
void setChannel(int channel);
}
具体设备实现:
// 电视实现
public class Tv implements Device {
private boolean on = false;
private int volume = 30;
private int channel = 1;
@Override
public boolean isEnabled() {
return on;
}
@Override
public void enable() {
on = true;
}
@Override
public void disable() {
on = false;
}
@Override
public int getVolume() {
return volume;
}
@Override
public void setVolume(int volume) {
this.volume = volume;
}
@Override
public int getChannel() {
return channel;
}
@Override
public void setChannel(int channel) {
this.channel = channel;
}
}
// 收音机实现
public class Radio implements Device {
// 实现与Tv类似
}
抽象部分(Abstraction):
// 远程控制器抽象
public abstract class Remote {
protected Device device;
public Remote(Device device) {
this.device = device;
}
public void togglePower() {
if (device.isEnabled()) {
device.disable();
} else {
device.enable();
}
}
// 其他功能...
}
具体的远程控制器实现:
// 基础遥控器
public class BasicRemote extends Remote {
public BasicRemote(Device device) {
super(device);
}
public void volumeDown() {
device.setVolume(device.getVolume() - 10);
}
public void volumeUp() {
device.setVolume(device.getVolume() + 10);
}
public void channelDown() {
device.setChannel(device.getChannel() - 1);
}
public void channelUp() {
device.setChannel(device.getChannel() + 1);
}
}
// 高级遥控器
public class AdvancedRemote extends BasicRemote {
public AdvancedRemote(Device device) {
super(device);
}
public void mute() {
device.setVolume(0);
}
}
客户端代码:
public class Demo {
public static void main(String[] args) {
Device tv = new Tv();
Remote basicRemote = new BasicRemote(tv);
basicRemote.togglePower();
Device radio = new Radio();
Remote advancedRemote = new AdvancedRemote(radio);
advancedRemote.togglePower();
((AdvancedRemote) advancedRemote).mute();
}
}
注意事项
- 正确理解抽象和实现:在桥接模式中,抽象并不是指抽象类或接口,而是指抽象的概念,即一个类的高层控制逻辑。实现指的是抽象的具体实现细节。
- 独立变化:桥接模式的目的是让抽象和实现可以独立变化,不要让它们之间的变化相互影响。
- 不要过度使用:如果系统中的抽象和实现之间的关系很稳定,或者不太可能发生变化,那么引入桥接模式可能会导致不必要的复杂性。使用桥接模式时应当考虑是否真的需要这种级别的抽象。