网站首页 > 技术文章 正文
简介
桥接模式(Bridge Pattern)是一种结构型设计模式,它将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,来实现二者的解耦。参与桥接的接口是稳定的,用户可以扩展和修改桥接中的类,但是不能改变接口。桥接模式通过接口继承实现或者类继承实现功能扩展。
如果你希望在几个独立维度上扩展一个类,或者你想要拆分、重组一个具有多重功能的复杂类(例如能与多个数据库服务器进行交互的类),或者你想在运行时切换不同的实现方法,可以使用桥接模式。
作用
- 在有多种可能会变化的情况下,用继承扩展起来不灵活,桥接可以解决类似问题。
- 桥接模式提高了系统的可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
实现步骤
- 定义一个工具接口,供不同工具类来实现。
- 建立多个具体工具类实现基础工具接口,这些工具是负责具体能力实现。
- 定义一个基础抽象类,里面聚合了工具接口,相当于桥接器。
- 建立具体对象类,继承自基础抽象类,调用工具类里的方法来实现具体功能。
UML
代码
基础抽象类
// AbstractShape.java 定义抽象桥接器,关联图形操作接口
public abstract class AbstractShape {s
protected DrawTool drawTool;
protected AbstractShape(DrawTool drawTool) {
this.drawTool = drawTool;
}
public abstract void draw(int x, int y, int radius);
}
具体桥接器实现类
// RefinedShape.java 具体桥接类,继承抽象桥接类,扩充了自己的方法
public class RefinedShape extends AbstractShape {
public RefinedShape(DrawTool drawTool) {
super(drawTool);
}
@Override
public void draw(int x, int y, int radius) {
System.out.println(String.format("RefinedShape::draw() [x=%s y=%s radius=%s]", x, y, radius));
// 通过工具类实际绘制
drawTool.drawStyle();
}
// 新增的方法,可作为工具类的补充
public void drawDone() {
System.out.println("RefinedShape::drawDone(), 执行的drawTool是: " + drawTool.getClass().getSimpleName());
}
}
定义工具接口类
// DrawTool.java 图形操作基础接口
public interface DrawTool {
public void drawStyle();
}
定义工具实现类,可以多个
```java
// DrawStyleA.java 画圆A,实现了图画基础API
public class DrawStyeA implements DrawTool {
@Override
public void drawStyle() {
System.out.println("DrawStyleA:drawStyle()");
}
}
```
```java
// 画圆B,实现了图画基础API
public class DrawStyleB implements DrawTool {
@Override
public void drawStyle() {
System.out.println("DrawStyleB:drawStyle()");
}
}
测试调用
/**
* 桥接模式是将基础抽象类作为桥接器,用来连接业务对象和具体动作,将两者充分解耦。
* 具体对象以抽象对象为父类,实现父类方法。
* 具体工具类实现统一的工具接口,为抽象桥接对象服务
* 使用时,声明具体对象同时传入具体工具,使得具体对象可以使用具体工具的动作。
*/
// 用抽象类来声明具体对象,并指定具体工具
AbstractShape shape = new RefinedShape(new DrawStyeA());
// 调用对象的方法,里面执行了工具类的方法
shape.draw(10, 20, 50);
RefinedShape shape1 = (RefinedShape) shape;
// 类型强转为具体业务类,调用具体类的方法
shape1.drawDone();
// /*********************** 分割线 ******************************************/
// 直接用具体类来声明对象,并指定另外的工具
RefinedShape shape2 = new RefinedShape(new DrawStyleB());
// 调用对象的方法,里面执行了工具类的方法
shape2.draw(11, 22, 33);
shape2.drawDone();
猜你喜欢
- 2025-07-27 打工人学Python:(七)自定义函数,打造自己的武器库
- 2025-07-27 Python绘菊花(用python画朵小菊花)
- 2025-07-27 盘点爬虫语言为何选择Python而不是Java
- 2025-07-27 Java/Go/Python/JS不同语言实现23种经典设计模式
- 2025-07-27 编写python脚本同步表数据到另数据库中的表
- 2025-07-27 混沌工程开源工具对比(混沌工程开源工具对比分析)
- 2025-07-27 Go 和 Python 程序运行时间比较(go和python哪个好)
- 2025-07-27 手把手带你进行Golang环境配置(golang运行时配置文件目录)
- 2025-07-27 web开发我更喜欢使用GO语言(go适合做web吗)
- 2025-07-27 慢到窒息!没想到未编译Python比Go慢上这么多……
- 289℃Python短文,Python中的嵌套条件语句(六)
- 285℃PythonNet:实现Python与.Net代码相互调用!
- 283℃python笔记:for循环嵌套。end=""的作用,图形打印
- 281℃Python实现字符串小写转大写并写入文件
- 278℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 137℃原来2025是完美的平方年,一起探索六种平方的算吧
- 123℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 115℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)