结构型模式2.桥接模式
结构型模式
- 适配器模式(Adapter Pattern)
- 桥接模式(Bridge Pattern)
- 组合模式(Composite Pattern)
- 装饰器模式(Decorator Pattern)
- 外观模式(Facade Pattern)
- 享元模式(Flyweight Pattern)
- 代理模式(Proxy Pattern)
桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与其实现部分分离,使得二者可以独立地变化。它主要用于解耦抽象与实现之间的关系,允许二者独立扩展。
关键概念
- 抽象(Abstraction):定义了抽象部分的接口,通常是客户端调用的接口。
- 扩充抽象(Refined Abstraction):是对抽象部分的具体实现,通常是对某些方法的细化。
- 实现(Implementor):定义了实现部分的接口,但不提供具体的实现。
- 具体实现(Concrete Implementor):提供实现接口的具体实现。
举个例子:远程控制器
假设我们有不同类型的遥控器和设备,遥控器可以控制不同的设备。我们使用桥接模式来解耦遥控器的操作逻辑与设备的控制逻辑,使得遥控器和设备可以独立扩展。
// 设备接口,定义所有设备的基本操作
public interface Device {
void turnOn(); // 打开设备
void turnOff(); // 关闭设备
void setVolume(int volume); // 设置音量
}
// 电视机类,具体的设备实现
public class TV implements Device {
private int volume;
@Override
public void turnOn() {
System.out.println("电视机打开了");
}
@Override
public void turnOff() {
System.out.println("电视机关闭了");
}
@Override
public void setVolume(int volume) {
this.volume = volume;
System.out.println("电视机音量设置为: " + volume);
}
}
// 收音机类,具体的设备实现
public class Radio implements Device {
private int volume;
@Override
public void turnOn() {
System.out.println("收音机打开了");
}
@Override
public void turnOff() {
System.out.println("收音机关闭了");
}
@Override
public void setVolume(int volume) {
this.volume = volume;
System.out.println("收音机音量设置为: " + volume);
}
}
// 遥控器接口,定义遥控器的基本操作
public abstract class RemoteControl {
protected Device device; // 关联一个设备
public RemoteControl(Device device) {
this.device = device;
}
public abstract void turnOn(); // 开启设备
public abstract void turnOff(); // 关闭设备
public abstract void setVolume(int volume); // 设置音量
}
// 基本遥控器,提供简单的开关和音量控制
public class BasicRemote extends RemoteControl {
public BasicRemote(Device device) {
super(device);
}
@Override
public void turnOn() {
device.turnOn();
}
@Override
public void turnOff() {
device.turnOff();
}
@Override
public void setVolume(int volume) {
device.setVolume(volume);
}
}
public class Client {
public static void main(String[] args) {
// 创建设备
Device tv = new TV();
Device radio = new Radio();
// 创建遥控器并控制不同的设备
RemoteControl basicRemote = new BasicRemote(tv);
System.out.println("使用遥控器控制电视:");
basicRemote.turnOn();
basicRemote.setVolume(15);
basicRemote.turnOff();
System.out.println("\n使用遥控器控制收音机:");
basicRemote = new BasicRemote(radio);
basicRemote.turnOn();
basicRemote.setVolume(10);
basicRemote.turnOff();
}
}
解释
-
抽象部分:
RemoteControl
是抽象类,它定义了对设备的操作方法(turnOn()
、turnOff()
、setVolume()
),但没有指定具体的设备。 -
实现部分:
Device
接口定义了所有设备应该具备的操作方法,并且由具体的设备(如TV
和Radio
)实现这些操作。 -
桥接:通过构造方法将设备传递给遥控器(
RemoteControl
),遥控器可以操作不同类型的设备,从而实现了设备和遥控器的解耦。 -
扩展:如果以后增加新类型的设备(如空调、音响等),我们只需要创建新的
Device
实现类,而不需要修改RemoteControl
类;同样,如果我们需要增加更复杂的遥控器功能,也可以直接在RemoteControl
类中扩展。
优点
- 解耦:抽象部分和实现部分解耦,可以独立变化。
- 灵活性:可以在不影响其他部分的情况下扩展系统。
- 可维护性:修改具体的设备或遥控器时,其他部分不需要修改。
适用场景
- 多个类的变体:当有多个类的不同变体,并且需要对这些变体进行操作时,可以使用桥接模式。
- 避免类爆炸:当系统需要结合多个维度的变化(如不同设备和不同类型的遥控器),可以使用桥接模式避免组合类导致的类爆炸。
总结
桥接模式是一种非常强大的结构性设计模式,可以有效地分离抽象与实现,允许独立地扩展两者,减少系统的复杂度。在面对多个变化维度时,桥接模式尤其有用。