桥接模式
介绍
桥接模式是一种结构型设计模式,它通过将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合的方式来实现,而不是继承。桥接模式通过将抽象和实现解耦,从而实现抽象和实现的分离,使得系统更加灵活。
角色
-
Abstraction(抽象类): 定义抽象类,包含一个对实现接口的引用,并定义一些抽象方法。
-
RefinedAbstraction(扩充抽象类): 对抽象类进行扩充,可以继承抽象类并实现抽象方法。
-
Implementor(实现类接口): 定义实现类的接口,可以包含一些基本的操作。
-
ConcreteImplementor(具体实现类): 实现Implementor接口的具体实现类。
使用场景
当我们要实现的系统可能存在多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。
结构图
案例
假设我们要设计一个远程控制器,它可以控制不同的设备,比如电视和音响。使用桥接模式可以使控制器和设备之间的关系更加灵活。
代码
// Implementor(实现类接口)
interface Device {
void turnOn();
void turnOff();
void setChannel(int channel);
}
// ConcreteImplementor(具体实现类1)
class TV implements Device {
@Override
public void turnOn() {
System.out.println("TV is turned on");
}
@Override
public void turnOff() {
System.out.println("TV is turned off");
}
@Override
public void setChannel(int channel) {
System.out.println("TV channel set to " + channel);
}
}
// ConcreteImplementor(具体实现类2)
class Stereo implements Device {
@Override
public void turnOn() {
System.out.println("Stereo is turned on");
}
@Override
public void turnOff() {
System.out.println("Stereo is turned off");
}
@Override
public void setChannel(int channel) {
System.out.println("Stereo channel set to " + channel);
}
}
// Abstraction(抽象类)
abstract class RemoteControl {
protected Device device;
public RemoteControl(Device device) {
this.device = device;
}
public abstract void turnOn();
public abstract void turnOff();
public abstract void setChannel(int channel);
}
// RefinedAbstraction(扩充抽象类)
class BasicRemoteControl extends RemoteControl {
public BasicRemoteControl(Device device) {
super(device);
}
@Override
public void turnOn() {
System.out.print("Basic remote: ");
device.turnOn();
}
@Override
public void turnOff() {
System.out.print("Basic remote: ");
device.turnOff();
}
@Override
public void setChannel(int channel) {
System.out.print("Basic remote: ");
device.setChannel(channel);
}
}
// RefinedAbstraction(扩充抽象类)
class AdvancedRemoteControl extends RemoteControl {
public AdvancedRemoteControl(Device device) {
super(device);
}
@Override
public void turnOn() {
System.out.print("Advanced remote: ");
device.turnOn();
}
@Override
public void turnOff() {
System.out.print("Advanced remote: ");
device.turnOff();
}
@Override
public void setChannel(int channel) {
System.out.print("Advanced remote: ");
device.setChannel(channel);
}
public void mute() {
System.out.println("Mute");
}
}
// Client(客户端)
public class BridgePatternExample {
public static void main(String[] args) {
// 使用桥接模式创建远程控制器和设备的组合
TV tv = new TV();
Stereo stereo = new Stereo();
RemoteControl basicRemote = new BasicRemoteControl(tv);
RemoteControl advancedRemote = new AdvancedRemoteControl(stereo);
// 使用远程控制器控制设备
basicRemote.turnOn();
basicRemote.setChannel(5);
basicRemote.turnOff();
System.out.println();
advancedRemote.turnOn();
advancedRemote.setChannel(10);
advancedRemote.turnOff();
((AdvancedRemoteControl) advancedRemote).mute();
}
}