模式概述:
可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构, 从而能在开发时分别使用。
使用场景:
1.如果你想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式。
2.如果你希望在几个独立维度上扩展一个类, 可使用该模式。
3.如果你需要在运行时切换不同实现方法, 可使用桥接模式。
代码样例:
代码背景: 桥接模式有两种理解方式,一种是类有多个独立变化的维度,通过组合模式代替继承来实现各个维度的独立扩展;还有另外一种比较“纯正”的理解,即Gof的《设计模式》中定义的“将抽象和实现解耦,让它们可以独立变化”(代码样例是这种理解方式);这里的抽象和实现并不是指的抽象类和接口的实现;这里的抽象是指与实际行为实现无关抽象出来的“类库”,实现是指具体行为实现相关的“类库”。以下代码是以遥控器控制设备运作的样例,其中设备就是实现部分,遥控器就是抽象部分;实现部分可以独自扩展出收音机、电视等,抽象部分可以独立扩展多种附加功能的高级遥控器。桥接模式与策略模式、适配器模式都是基于组合思想将工作委派给其他对象。
/**
* 设备(实现部分)
*/
public interface Device {
/**
* 是否开机
*/
public boolean isEnable();
/**
* 关机
*/
public void disable();
/**
* 开机
*/
public void enable();
/**
* 设置音量
*/
public void setVolume(int volume);
/**
* 获取当前音量
*/
public int getVolume();
}
/**
* 收音机
*/
public class Radio implements Device{
private boolean on = false;
private int volume = 30;
@Override
public boolean isEnable() {
return on;
}
@Override
public void disable() {
on = false;
}
@Override
public void enable() {
on = true;
}
@Override
public void setVolume(int volume) {
if(volume>100){
this.volume = 100;
}else if(volume<0){
this.volume = 0;
}else{
this.volume = volume;
}
}
@Override
public int getVolume(){
return volume;
}
@Override
public String toString() {
return "Radio{" +
"on=" + on +
", volume=" + volume +
'}';
}
}
/**
* 收音机
*/
public class Tv implements Device{
private boolean on = false;
private int volume = 30;
@Override
public boolean isEnable() {
return on;
}
@Override
public void disable() {
on = false;
}
@Override
public void enable() {
on = true;
}
@Override
public void setVolume(int volume) {
if(volume>100){
this.volume = 100;
}else if(volume<0){
this.volume = 0;
}else{
this.volume = volume;
}
}
@Override
public int getVolume(){
return volume;
}
@Override
public String toString() {
return "Tv{" +
"on=" + on +
", volume=" + volume +
'}';
}
}
/**
* 遥控器(抽象部分)
*/
public interface Remote {
/**
* 开关按钮
*/
public void power();
/**
* 加音量
*/
public void upVolume();
/**
* 减音量
*/
public void downVolume();
}
/**
* 遥控器base实现类
*/
public class BaseRemoteImpl implements Remote{
protected Device device;
public BaseRemoteImpl(Device device) {
this.device = device;
}
@Override
public void power() {
if(device.isEnable()){
device.disable();
}else{
device.enable();
}
}
@Override
public void upVolume() {
device.setVolume(device.getVolume()+10);
}
@Override
public void downVolume() {
device.setVolume(device.getVolume()-10);
}
public void getDeviceStatus(){
System.out.println(device.toString());
}
}
/**
* 一种高级遥控器
*/
public class AdvancedRemoteImpl extends BaseRemoteImpl{
public AdvancedRemoteImpl(Device device) {
super(device);
}
/**
* 静音
*/
public void mute(){
device.setVolume(0);
}
}
public class TestBridge {
public static void main(String[] args) {
BaseRemoteImpl baseRemote = new BaseRemoteImpl(new Radio());
baseRemote.upVolume();
baseRemote.getDeviceStatus();
AdvancedRemoteImpl advancedRemote = new AdvancedRemoteImpl(new Tv());
advancedRemote.mute();
advancedRemote.getDeviceStatus();
}
}
测试结果: