登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
每日签到
每天签到奖励2圆-6圆
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
VIP申请
VIP网盘
网盘
联系我们
每日签到
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
【设计模式】如何通过桥接模式解决系统扩展难题? ...
【设计模式】如何通过桥接模式解决系统扩展难题?
[ 复制链接 ]
诉称
2025-6-6 14:50:03
概述
现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:
我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。
试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。
定义:
将抽象与实现分离,使它们可以独立变化。它是用
组合关系代替继承关系
来实现,从而降低了抽象和实现这两个可变维度的耦合度。
结构
桥接(Bridge)模式包含以下主要角色:
抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。
案例
【例】视频播放器
需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Mac、Linux等)上播放多种格式的视频文件,常见的视频格式包括RMVB、AVI、WMV等。该播放器包含了两个维度,适合使用桥接模式。
类图如下:
代码如下:
//视频文件
public interface VideoFile {
void decode(String fileName);
}
//avi文件
public class AVIFile implements VideoFile {
public void decode(String fileName) {
System.out.println("avi视频文件:"+ fileName);
}
}
//rmvb文件
public class REVBBFile implements VideoFile {
public void decode(String fileName) {
System.out.println("rmvb文件:" + fileName);
}
}
//操作系统版本
public abstract class OperatingSystemVersion {
protected VideoFile videoFile;
public OperatingSystemVersion(VideoFile videoFile) {
this.videoFile = videoFile;
}
public abstract void play(String fileName);
}
//Windows版本
public class Windows extends OperatingSystem {
public Windows(VideoFile videoFile) {
super(videoFile);
}
public void play(String fileName) {
videoFile.decode(fileName);
}
}
//mac版本
public class Mac extends OperatingSystemVersion {
public Mac(VideoFile videoFile) {
super(videoFile);
}
public void play(String fileName) {
videoFile.decode(fileName);
}
}
//测试类
public class Client {
public static void main(String[] args) {
OperatingSystem os = new Windows(new AVIFile());
os.play("战狼3");
}
}
复制代码
好处:
桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。如:如果现在还有一种视频文件类型wmv,我们只需要再定义一个类实现VideoFile接口即可,其他类不需要发生变化。
实现细节对客户透明
使用场景
当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
往期推荐
《SpringBoot》EasyExcel实现百万数据的导入导出
《SpringBoot》史上最全SpringBoot相关注解介绍
Spring框架IoC核心详解
万字长文带你窥探Spring中所有的扩展点
如何实现一个通用的接口限流、防重、防抖机制
万字长文带你深入Redis底层数据结构
volatile关键字最全原理剖析
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
设计模式
如何
通过
桥接
模式
相关帖子
面试官:如何确保动态线程池任务都执行完?
技术干货 | 如何将大表在线改造为分区表并释放空间
面试官:如何提升项目并发性能?
希音面试:频繁 fullgc,如何排查?(图解+秒懂+史上最全)
Selenium Web自动化:如何稳定地定位动态元素?8种方法汇总
海量数据如何“安家”?一文读懂哈希、范围和一致性哈希三大分片策略
Python Flask框架入门_2.通过token认证验证API的访问权限
Oracle如何修改账号密码版本?
有向距离场SDF,在游戏中如何实现agent导航以及绕障
Oracle如何生成导出账号的DDL脚本
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
面试官:如何确保动态线程池任务都执行完?
0
760
水苯
2025-09-04
安全
技术干货 | 如何将大表在线改造为分区表并释放空间
0
439
届表
2025-09-05
业界
面试官:如何提升项目并发性能?
0
257
轧岔
2025-09-05
安全
希音面试:频繁 fullgc,如何排查?(图解+秒懂+史上最全)
0
46
每捎京
2025-09-05
科技
Selenium Web自动化:如何稳定地定位动态元素?8种方法汇总
0
430
涣爹卮
2025-09-06
业界
海量数据如何“安家”?一文读懂哈希、范围和一致性哈希三大分片策略
0
296
田雅宁
2025-09-08
安全
Python Flask框架入门_2.通过token认证验证API的访问权限
0
452
裆趾针
2025-09-08
安全
Oracle如何修改账号密码版本?
0
325
倡遍竽
2025-09-09
科技
有向距离场SDF,在游戏中如何实现agent导航以及绕障
0
408
崔竹
2025-09-11
安全
Oracle如何生成导出账号的DDL脚本
0
631
齐娅晶
2025-09-11
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
诉称
2025-6-6 14:50:03
关注
0
粉丝关注
17
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
杭环
9988
凶契帽
9988
4
氛疵
9988
5
黎瑞芝
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多