前言
在软件开发的世界里,设计模式如同一本精妙的编码诗集,已经成为一种标准的编程实践。在Java编程中,设计模式很重要。是软件开发中广泛应用的一种编程方法,它可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本人将制作一个关于Java设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源:Gitee点击跳转。在上一篇《Java设计模式(5)适配器模式》文章中,我们介绍了适配器模式。本文是这个系列的第六篇章,我们将讲解一下桥接模式的实现方式、应用场景以及它的用途。
桥接模式
桥接模式是将抽象部分与其实现部分分离,使它们可以独立变化,而不会相互影响。在Java中,桥接模式通常用于处理类的多层继承结构,通过将抽象与实现分离,使得它们可以独立扩展。
使用场景
- 当一个类存在两个独立变化的维度时。
- 当希望避免在抽象和实现之间建立固定的绑定关系时。
- 当一个类需要在运行时动态选择实现时。
代码实现
这里以电子设备控制器来实现,在电子设备控制器中,桥接模式可以将抽象的设备控制接口与不同的设备(如电脑、手机等)的实现部分分离开来,使得控制器可以方便地控制不同的设备。
定义一个控制开关接口
代码语言:javascript复制/**
* 开关接口
* @author Jensen
* @date 2024-01-24
* */
public interface Switch {
void turnOn();
void turnOff();
}
创建Computer和Phone实现类,分别实现开关接口
ComputerImpl:
代码语言:javascript复制/**
* 计算机实现类
* @author Jensen
* @date 2024-01-24
* */
public class ComputerImpl implements Switch {
@Override
public void turnOn() {
System.out.println("打开电脑");
}
@Override
public void turnOff() {
System.out.println("关闭电脑");
}
}
Phone:
代码语言:javascript复制/**
* 手机实现类
* @author Jensen
* @date 2024-01-24
* */
public class Phone implements Switch {
@Override
public void turnOn() {
System.out.println("打开手机");
}
@Override
public void turnOff() {
System.out.println("关闭手机");
}
}
创建RemoteControl抽象类
RemoteControl 定义了抽象部分的接口,并维护一个指向实现部分的引用。它通常包含对实现部分的委托方法
代码语言:javascript复制/**
* 远程控制抽象类
* @author Jensen
* @date 2024-01-24
* */
public abstract class RemoteControl {
protected Switch aSwitch;
public RemoteControl(Switch aSwitch) {
this.aSwitch = aSwitch;
}
public abstract void On();
public abstract void Off();
}
创建AdvancedRemoteControl扩展抽象类
AdvancedRemoteControl 拓展了RemoteControl 的抽象方法,可以在拓展处添加额外的功能
代码语言:javascript复制/**
* 控制抽象类的扩展
* @author Jensen
* @date 2024-01-24
* */
public class AdvancedRemoteControl extends RemoteControl{
public AdvancedRemoteControl(Switch aSwitch) {
super(aSwitch);
}
@Override
public void On() {
aSwitch.turnOn();
}
@Override
public void Off() {
aSwitch.turnOff();
}
}
测试使用
分别对电脑和手机进行开机和关机的控制
代码语言:javascript复制System.out.println("------------------------------桥接模式-----------------------------");
Switch computer1 = new ComputerImpl();
Switch phone = new Phone();
RemoteControl controlComputer = new AdvancedRemoteControl(computer1);
RemoteControl controlPhone = new AdvancedRemoteControl(phone);
controlComputer.On();
controlPhone.On();
controlComputer.Off();
controlPhone.Off();
结语
在一些流行的日志框架,如Log4j和Logback,也使用了桥接模式。它们定义了一个抽象的日志记录接口,而具体的日志记录实现则是不同的日志记录器(如控制台日志记录器、文件日志记录器等)。
还有Java AWT 和 Swing 中的图形界面组件也是使用了桥接模式。抽象部分是图形界面组件的功能,而实现部分则是对应操作系统平台上的实际图形界面组件的实现。