桥接模式(Bridge Pattern)也称为桥梁模式、接口模式或者柄体模式,有点像适配器模式,也是 GoF 的 23 种设计模式中的一种结构型设计模式。

桥接模式 是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

~

本篇内容包括:关于桥接模式、桥接模式实现 Demo


文章目录

  • 一、关于桥接模式
    • 1、关于桥接模式
    • 2、关于桥接模式的构成
    • 3、关于桥接模式的XML
    • 4、关于桥接模式的应用场景
    • 5、关于桥接模式的优缺点
  • 二、桥接模式 Demo
    • 1、Demo 设计
    • 2、Demo 实现
    • 3、Demo 测试

一、关于桥接模式

1、关于桥接模式

桥接模式(Bridge Pattern)也称为桥梁模式、接口模式或者柄体模式,有点像适配器模式,也是 GoF 的 23 种设计模式中的一种结构型设计模式。

桥接模式 是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

2、关于桥接模式的构成

外观模式主要包含四种角色:

  • 抽象化(Abstraction)角色: 该类持有一个对实现角色的引用,抽象角色中的方法需要实现角色来实现,抽象角色一般为抽象类(构造函数规定子类要传入一个实现对象);
  • 修正抽象(RefinedAbstraction)角色: Abstraction 的具体实现,对Abstraction 的方法进行完善和扩展;
  • 实现化(Implementor)角色: 确定实现维度的基本操作,提供给 Abstraction使用。该类一般为接口或者抽象类;
  • 具体实现(ConcreteImplementor)角色: Implementor 的具体实现;

3、关于桥接模式的XML

4、关于桥接模式的应用场景

当一个类内部具备两种或多种变化维度时,使用桥接模式可以解耦这些变化的维度,使高层代码架构稳定。桥接模式适用于以下几种业务场景:

  • 在抽象和具体实现之间需要增加更多的灵活性的场景
  • 一个类存在两个或多个独立变化的维度,而这两个或多个维度都需要独立进行扩展
  • 不希望使用继承,或因为多层继承导致系统类的个数剧增

5、关于桥接模式的优缺点

# 桥接模式的优点

  • 抽象与实现分离,扩展能力强
  • 符合开闭原则
  • 符合合成复用原则
  • 其实现细节对客户透明

# 桥接模式的缺点

  • 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。

二、桥接模式 Demo

1、Demo 设计

开发一个跨平台视频播放器,可以在不同操作系统平台(如 Windows、Mac、Linux 等)上播放多种格式的视频文件,常见的视频格式包括 RMVB、AVI、WMV 等。该播放器包含了两个维度,适合使用桥接模式。

2、Demo 实现

# VideoFile 视频文件 Abstraction 角色

/*** 视频文件**/
public interface VideoFile {void decode(String fileName);
}

# avi文件 / rmvb文件 RefinedAbstraction 角色

/*** 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);}
}

# OperatingSystem 操作系统 Implementor 角色

/*** 操作系统**/
public abstract class OperatingSystem {protected VideoFile videoFile;public OperatingSystem(VideoFile videoFile) {this.videoFile = videoFile;}public abstract void play(String fileName);
}

# Windows / Mac ConcreteImplementor 角色

/*** 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 OperatingSystem {public Mac(VideoFile videoFile) {super(videoFile);}public void play(String fileName) {videoFile.decode(fileName);}
}

3、Demo 测试

/*** 测试类**/
public class Client {public static void main(String[] args) {OperatingSystem os = new Windows(new AVIFile());os.play("间谍过家家");}
}

详解设计模式:桥接模式相关推荐

  1. 代码详解设计模式--模板模式

    模板模式   一个抽象类公开定义了执行方法的模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行. 优点: 封装不变部分,扩展可变部分. 提取公共代码,便于维护. 行为由父类控制,子 ...

  2. C++设计模式--单例模式详解(懒汉模式、饿汉模式、双重锁)

    C++设计模式--单例模式详解(懒汉模式.饿汉模式.双重锁) 应用场景 一.单例模式是什么? 二.使用步骤 1.UML图 2.代码实现 应用场景 通常我们在做通讯的时候,我们跟服务器数据交互,假如每次 ...

  3. 跟着ZHONGHuan学习设计模式--桥接模式

    转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...

  4. 大型分布式架构详解:架构模式+敏捷性+可扩展+案例等

    大型分布式架构详解:架构模式+敏捷性+可扩展+案例等 本篇是大型分布式网站架构的技术总结篇. 主要对大型分布式架构中涉及的架构模式.高性能.高可用.可伸缩.敏捷性.可扩展等技术点进行简要总结,对大型分 ...

  5. 模板模式详解、模板模式怎么用、模板模式模板代码

    模板模式详解.模板模式怎么用.模板模式模板代码 文章目录 模板模式详解.模板模式怎么用.模板模式模板代码 @[toc] 模板模式定义 使用场景 优点 代码实操 模板模式定义 在模板模式(Templat ...

  6. 代码详解设计模式汇总

    小博Spring Boot快速入门GitChat https://gitbook.cn/gitchat/activity/5a444c451f6ee91a25846ac1 小博代码详解设计模式 篇章 ...

  7. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

  8. 【学习笔记】ABAP OOD设计模式 - 桥接模式

    ABAP OOD设计模式 - 桥接模式 整理转自-<SAP ABAP 面向对象程序设计(原则.模式及实践)> 桥接模式又称为桥梁模式,在程序开发中,采用不同的维度分解一系列对象,然后采用组 ...

  9. window 程序报错 自动重启_好程序员web前端教程之详解JavaScript严格模式

    好程序员web前端教程之详解JavaScript严格模式,严格模式(Strict mode)是由ECMA-262规范定义的新兴JavaScript标准,发布于2009年12月第五版.旨在改善错误检查功 ...

  10. jsp漂亮的登录界面源码_【案例+源码】详解MVC框架模式及其应用

    案例+源码]详解MVC框架模式及其应用 写在开头: 首先我们需要知道,框架模式.模式.开发模式是三种不同的概念,但他们的目的都一样:解耦! 1.关于MVC框架模型 MVC是三个单词的缩写: M,Mod ...

最新文章

  1. opencv中Range类的使用
  2. 120.数据缓存cache的基本概念
  3. 2017年10月05日普及组 比萨
  4. PHP传值及引用_无需整理
  5. ORACLE如何一次性修改用户连接数?
  6. Codeforces Round #485 (Div. 2)
  7. js中call和apply的作用和用法
  8. 汇编语言 王爽 第四版 第二章 检测点2.3
  9. android系统源代码单独编译应用程序
  10. Linux创建文本文件【Ubuntu】
  11. 我开源了一个私人云盘——蓝眼云盘
  12. 如何打开.chm文件
  13. 未来是现在的将来时,在社科院杜兰金融管理硕士项目酝酿灿烂的明天
  14. 【UI设计No5】LOGO设计
  15. Python 爬取微信公众号文章和评论 (有源码)
  16. 转-基于NodeJS的14款Web框架
  17. Python爬虫——新浪微博(网页版)
  18. 页面静态化----------------------------------------个人笔记
  19. Open Infrastructure丹佛峰会即将召开,这些边缘计算议题等你来听
  20. 网易2018校园招聘编程题

热门文章

  1. 抽象数据类型Polynomial 的实现(第二章 P40-43 算法2.22,2.23)
  2. 百度地图 polygon点击事件_中国地图的画法
  3. linux 系统基础命令
  4. Unity——写入和读取Json信息的方法
  5. 分享一个Qt实现的AI版俄罗斯方块
  6. B2C电子商务能否通吃线上线下?
  7. 网络攻防技术——黑客攻防
  8. 经典算法之右边界二分查找法(俗称基本右边界二分搜索法)
  9. 华为路由器:AR1200真机忘记Console口密码的处理方法全过程演示
  10. 常用的计算机有哪些台式的还有哪些,现在台式电脑的主流配置有哪些?