设计模式—桥接模式
桥接模式
桥梁模式(Bridge Pattern) 也叫做桥接模式, 是一个比较简单的模式 。
桥接模式是一种结构模式。桥接模式遵循了里氏替换原则和依赖倒置原则,最终实现了开闭原则,对修改关闭,对扩展开放 。
定义:将抽象和实现解耦, 使得两者可以独立地变化。
主要特点:将抽象与行为实现分离开,从而保持各部分的独立性以及应为他们的功能扩展。
桥接模式连接两边,分别是类的功能层次结构与类的实现层次结构。
优点
- 抽象和实现分离 。
- 优秀的扩充能力 。
- 实现细节对客户透明 。客户不用关心细节的实现, 它已经由抽象层通过聚合关系完成了封装。
使用场景
- 不希望或不适用使用继承的场景 。例如继承层次过渡、 无法更细化设计颗粒等场景, 需要考虑使用桥梁模式。
- 接口或抽象类不稳定的场景。明知道接口不稳定还想通过实现或继承来实现业务需求, 那是得不偿失的, 也是比较失败的做法。
- 重用性要求较高的场景 。
注意事项
桥梁模式是非常简单的, 使用该模式时主要考虑如何拆分抽象和实现, 并不是一涉及继承就要考虑使用该模式, 那还要继承干什么呢? 桥梁模式的意图还是对变化的封装, 尽量把可能变化的因素封装到最细、 最小的逻辑单元中, 避免风险扩散。 因此读者在进行系统设计时, 发现类的继承有N层时, 可以考虑使用桥梁模式。
案例分析
类的实现层次结构
- 定义实现角色的接口
public interface Brand {
void open();
void close();
void call();
}
- 定义具体实现话角色1
public class Vivo implements Brand {
@Override
public void open() {
System.out.println("Vivo手机开机");
}
@Override
public void close() {
System.out.println("Vivo手机关机");
}
@Override
public void call() {
System.out.println("Vivo手机打电话");
}
}
- 定义具体实现话角色2
public class XiaoMi implements Brand {
@Override
public void open() {
System.out.println("小米手机开机");
}
@Override
public void close() {
System.out.println("小米手机关机");
}
@Override
public void call() {
System.out.println("小米手机打电话");
}
}
类的功能层次结构
- 定义抽象化角色
public abstract class Phone {
private Brand brand;
public Phone(Brand brand) {
super();
this.brand = brand;
}
protected void open() {
brand.open();
}
protected void close() {
brand.close();
}
protected void call() {
brand.call();
}
}
- 定义扩展抽象化角色
public class FoldedPhone extends Phone {
public FoldedPhone(Brand brand) {
super(brand);
}
@Override
public void open() {
super.open();
System.out.println("折叠样式手机");
}
@Override
public void close() {
super.close();
System.out.println("折叠样式手机");
}
@Override
public void call() {
super.call();
System.out.println("折叠样式手机");
}
}
- 定义客户端测试
public class Client {
public static void main(String[] args) {
FoldedPhone phone = new FoldedPhone(new XiaoMi());
phone.open();
phone.close();
phone.call();
System.out.println();
FoldedPhone phone1 = new FoldedPhone(new Vivo());
phone1.open();
phone1.close();
phone1.call();
}
}
输出:
小米手机开机
折叠样式手机
小米手机关机
折叠样式手机
小米手机打电话
折叠样式手机Vivo手机开机
折叠样式手机
Vivo手机关机
折叠样式手机
Vivo手机打电话
折叠样式手机Process finished with exit code 0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现