【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录
- 一、桥接模式简介
- 二、桥接模式适用场景
- 三、桥接模式优缺点
- 四、桥接模式相关设计模式
- 五、桥接模式代码示例
- 1、视频格式抽象
- 2、FLV 视频格式实现
- 3、MP4 视频格式实现
- 4、系统平台抽象
- 5、Linux 系统平台实现
- 6、Android 系统平台实现
- 7、测试类
一、桥接模式简介
桥接模式 :
- 分离抽象实现 : 将 抽象部分 与 它的 具体实现部分 分离 , 使它们 都可以 独立的 变化 ; 独立的变化 就是 在一定程度上 进行解耦 ;
- 组合方式 : 通过 组合 的方式 建立 两个类 之间的联系 , 而 不是 继承 ;
桥接模式类型 : 结构型 ;
桥接模式 相当于 使用桥梁 将两侧连接起来 , 这里指的是 使用桥梁 连接两个类 , 在两个类之间建立某种联系 , 可以通过继承 , 也可以通过组合 , 桥接模式 是采用 组合的方式 , 建立两个类之间的关系 ; 合成复用原则 , 推荐优先使用组合 , 不是继承 ; 桥接模式 可以防止子类过多 , 造成系统复杂的情况 ;
桥接模式的重点 是 理解 类的 抽象部分 和 具体的实现部分 ;
抽象过程 : 抽象部分 , 经过 抽象化 , 忽略某些信息 , 将不同的实体当做同一个对待 ; 面向对象中 , 将对象的共同性质抽取出来 , 形成类的过程 , 就是抽象化过程 ;
实现过程 : 对于具体实现的部分 , 也要进行实现化 , 针对抽象化 , 给出具体实现 ; 这个过程就是实现过程 , 过程的产出就是具体实现部分 , 具体实现部分产生的对象 , 比抽象产生的更具体 , 是对抽象化事物的具体化产物 ;
如 : 开发跨平台的视频播放器 , 平台有 Android , iOS , Windows , Linux , Mac , 播放器支持的格式有 MP4 , AVI , RMVB , FLV 格式 ; 这种情况下 , 适合使用桥接模式 ;
二、桥接模式适用场景
桥接模式适用场景 :
抽象实现灵活 : 抽象 和 具体实现 之间 , 需要 增加更多灵活性 的情况下 , 适合使用桥接模式 ;
使用 桥接模式 , 可以 避免在这两个层次之间 , 建立静态的继承关系 , 通过 桥接模式 在二者之间建立 关联关系 ;
抽象 和 实现 都可以 各自 以继承的方式扩展 , 互不影响 ;
可以动态的 将 抽象 的子类对象 和 实现 的子类对象 进行组合 , 在系统中 , 抽象 和 实现 之间进行了解耦 ;独立变化维度 : 一个类存在 2 2 2 个或更多的 独立变化维度 , 并且这些维度都需要 独立扩展 ;
抽象部分可以 独立扩展 , 具体实现的部分 , 也可以独立扩展 ;不使用继承 : 不希望使用继承 , 或 因多层继承导致系统类的个数增加 ;
三、桥接模式优缺点
桥接模式优点 :
分离抽象与实现 : 分离 抽象部分 和 具体实现部分 ;
桥接模式 使用 组合关系 解耦了 抽象 和 实现 之间的继承关系 ;
抽象 和 实现 可以格子 沿着自己的维度进行扩展 ;
抽象 和 实现 不在同一个继承层次中 , 通过进行组合 , 可以获得多维度的组合对象 ;提高扩展型 : 提高了系统的 可扩展性 ;
解耦了 抽象 与 实现 , 二者可以继续进行扩展 , 不需要改变系统原有的功能 ;符合开闭原则 ;
符合合成复用原则 ;
桥接模式缺点 :
系统复杂 : 增加了 系统的 理解 与 设计难度 ;
识别变化维度 : 需要正确地 识别出 系统中 , 两个独立变化的 维度 ;
桥接模式的使用范围 , 有一定的局限性 ;
四、桥接模式相关设计模式
桥接模式与组合模式 :
组合模式 更强调 部分 与 整体间的组合 ;
桥接模式 更强调 平行级别上 , 不同类的组合 ;
桥接模式与适配器模式 :
共同点 : 都是让 两个类 配合工作 ;
不同点 : 二者目的不同 ;
- 适配器模式 是改变已有接口 , 让二者之间相互配合 ; 目的是配合 ;
- 桥接模式 分离 抽象 和 具体 的实现 , 目的是分离 ;
五、桥接模式代码示例
业务逻辑场景 : 开发跨平台的视频播放器 , 平台有 Android , iOS , Windows , Linux , Mac , 播放器支持的格式有 MP4 , AVI , RMVB , FLV 格式 ; 这种情况下 , 适合使用桥接模式 ;
平台 : 播放器支持 Linux , Android 平台 ;
视频格式 : 播放器支持 MP4 , FLV 视频格式 ;
这里分为两块 , 一块是平台 , 一块是视频格式 ;
平台可以不断的扩展 , 如 : Windows , iOS , MAC , 嵌入式平台 ;
视频类型也可以不断的扩展 , 如 : H264 , H265 , MPEG 等 ;
二者可以随着自己的层级进行扩展 ;
桥接模式 最重要的是 将 抽象 与 实现 解耦 , 通过组合 在 抽象 与 实现 之间搭建桥梁 ;
1、视频格式抽象
package bridge;public interface Vedio {/*** 打开视频* 可以打开 MP4 / FLV 格式视频* 视频 ( 格式 ) 是个 抽象* @return*/Vedio openVedio();/*** 查看视频信息*/void showVedio();
}
2、FLV 视频格式实现
package bridge;/*** FLV 视频格式*/
public class FlvVedio implements Vedio {@Overridepublic Vedio openVedio() {System.out.println("打开 FLV 格式视频");return new FlvVedio();}@Overridepublic void showVedio() {System.out.println("当前视频格式是 FLV");}
}
3、MP4 视频格式实现
package bridge;/*** MP4 格式*/
public class MP4Vedio implements Vedio {@Overridepublic Vedio openVedio() {System.out.println("打开 MP4 格式视频");return new MP4Vedio();}@Overridepublic void showVedio() {System.out.println("当前视频格式是 MP4");}
}
4、系统平台抽象
package bridge;/*** 平台操作系统 抽象类*/
public abstract class Platform {/*** 这是桥接模式最核心的代码* 在 Platform 中通过组合方式关联 Vedio* Platform 的子类也可以关联 Vedio 子类*/protected Vedio account;public Platform(Vedio account) {this.account = account;}/*** 该方法与 Vedio 中的方法名相同* 方法名相同不是强制的* @return*/abstract Vedio openVedio();
}
5、Linux 系统平台实现
package bridge;public class LinuxPlatform extends Platform {public LinuxPlatform(Vedio account) {super(account);}@OverrideVedio openVedio() {System.out.println("在 Linux 平台播放视频");return account;}
}
6、Android 系统平台实现
package bridge;public class AndroidPlatform extends Platform {public AndroidPlatform(Vedio account) {super(account);}@OverrideVedio openVedio() {System.out.println("在 Android 平台打开视频");return account;}
}
7、测试类
package bridge;public class Main {public static void main(String[] args) {// 在 Linux 平台打开 FLV 视频Platform linuxPlatform = new LinuxPlatform(new FlvVedio());Vedio linuxFlv = linuxPlatform.openVedio();linuxFlv.showVedio();System.out.println();// 在 Android 平台打开 MP4 视频Platform androidPlatform = new AndroidPlatform(new MP4Vedio());Vedio androidMp4 = androidPlatform.openVedio();androidMp4.showVedio();}
}
执行结果 :
在 Linux 平台播放视频
当前视频格式是 FLV在 Android 平台打开视频
当前视频格式是 MP4
【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )相关推荐
- 【设计模式】模板方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.模板方法模式简介 二.模板方法模式适用场景 三.模板方法模式优缺点 四.模板方法扩展 五.模板方法模式相关设计模式 六.模板方法模式代码示例 1.模板方法抽象类 2.模板方法实现类 1 ...
- 【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.策略模式简介 二.策略模式适用场景 三.策略模式优缺点 四.策略模式与其它设计模式 五.策略模式代码示例 1.促销策略接口 2.满减促销策略 3.返现促销策略 4.空促销策略 5.促销策 ...
- 【设计模式】中介者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.中介者模式简介 二.中介者模式适用场景 三.中介者模式优缺点 四.中介者模式 与 观察者模式 五.中介者模式 代码示例 1.聊天室 2.用户 3.运行实例 一.中介者模式简介 中介者模式 ...
- 【设计模式】状态模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.状态模式简介 二.状态模式适用场景 三.状态模式优缺点 四.状态模式相关设计模式 五.状态模式代码示例 1.状态类父类 2.播放状态类 3.暂停状态类 4.快进状态类 5.停止状态类 6 ...
- 【设计模式】访问者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.访问者模式简介 二.访问者模式 适用场景 三.访问者模式 优缺点 四.访问者模式 与 迭代器模式 五.代码示例 1.Game 父类 ( 被访问者 ) 2.VipGame 收费游戏 ( 被 ...
- 【设计模式】工厂方法模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.工厂方法模式简介 二.工厂方法模式适用场景 三.工厂方法模式优缺点 四.工厂方法模式代码示例 1.产品抽象类 2.产品实现类 1 3.产品实现类 2 4.抽象工厂类 5.实现工厂类 1 ...
- 【设计模式】解释器模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.解释器模式简介 二.解释器模式适用场景 三.解释器模式优缺点 四.解释器模式与适配器模式 五.解释器模式代码示例 1.解释器接口 2.加法解释器 3.乘法解释器 4.整型解释器 5.语法 ...
- 【设计模式】建造者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.建造者模式简介 二.建造者模式适用场景 三.建造者模式优缺点 四.建造者模式与工厂模式 五.建造者模式代码示例 1.学生类 2.建造者抽象类 3.建造者实现类 4.教师类 ( 非必须 ) ...
- 【设计模式】组合模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
文章目录 一.组合模式简介 二.组合模式适用场景 三.组合模式优缺点 四.组合模式和访问者模式 五.组合模式代码示例 1.书籍和目录的抽象父类 2.书籍类 3.目录类 4.测试类 一.组合模式简介 组 ...
最新文章
- 2017SDN市场一片繁荣,全球企业纷纷“亮剑“
- Vue.js slots: 为什么你需要它们?
- SAP QM初阶之维护检验计划时可以不用事先创建好检验特性主数据
- WP8.1 Study4:WP8.1中控件集合应用
- lucene.net 某些类的介绍
- 个人站立会议(11月17日)
- 将优化问题转化为决策问题
- SPI-软件开发注意事项
- 【C++grammar】C++类数据成员的初始化
- eclipse启动失败:An internal error occurred during: reload maven project
- (四)nodejs循序渐进-函数,类和对象(基础篇)
- leetcode 45 python
- python求平方根的小数_python中的数字和数学运算
- eclipse 中的注释 快捷键
- QQ浏览器文章评论的BUG:评论者错了
- 迄今以来在硅谷的最大押注:摩根大通雇超千人专注金融科技
- 不做自了汉,大家好才是真的好
- 地图省界线什么样_地图上省份的划分精细复杂,为何分得这么细致?原来有这么多学问...
- Linux服务器之Samba匿名访问配置
- oracle为什么打开鼠标不见了,鼠标箭头突然不见了该怎么办呢?
热门文章
- python 在线学习站点
- 什么是IOC和AOP?
- loggging 日志
- 蓝税问答|今天,有幸见识了各类“住房租金”的优惠!
- 【学习日志】2023.01.20 C# PokemonManager
- 百家号怎么赚钱,百家号赚钱实操攻略
- 计算机服务功能有哪些,台式电脑哪些服务不能禁用?或者哪些服务必须禁用?...
- 严重性 代码 说明 项目 文件 行 禁止显示状态错误 CefSharp.Common will work out of the box if you specify platform (x86 /
- 富人为什么富 穷人为什么穷?
- jsrender的使用总结