目录

一、定义

二、理解桥接模式

三、桥接模式案例分析

四、总结


一、定义

桥接模式,其定义如下:

将抽象部分与实现部分分离开来,使他们可以在多个维度独立变化。

桥接模式的重点是在“解耦”上,如何让它们两者解耦是我们要了解的重点。

桥接模式将继承关系转换为关联关系(组合或者聚合)来实现,符合合成复用原则,这样有利于降低类之间的耦合度,同时也减少了类的数量,方便后期扩展维护。

举个例子,现在有一个需求:绘制大中小型号的图形,图形分长方形、正方形、圆形等,图像分大、中、小等型号,这里有两个维度(大小、图形类型)都会进行变化,桥接模式就是将这种多角度分类给分离出来让他们独立变化,减少他们之间的耦合关系。

如果不使用桥接模式的话而使用继承来实现上面的需求,我们的类之间的关系可能大概如下:

可见,如果后期在两个维度都进行扩展,增加新的大小型号和图形类型,那么是不是还要创建很多子类。

使用桥接模式之后的类关系图如下: 

有了桥接模式,我们就可以将这两个维度的变化给分开,然后通过组合或者聚合的关系关联起来,降低它们之间的耦合,也减少了大量的继承创建类。这样就可以通过任意组合来达到不同大小的不同图形,就算后期扩展了,也不需要改动之前的代码,符合开闭原则。

二、理解桥接模式

要理解桥接模式,我们首先需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。

• 抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。

• 实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。

• 脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化。

下面来看看桥接模式涉及的几个角色:

  • Abstraction抽象化角色:它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类;
  • RefinedAbstraction修正抽象化角色:它引用实现化角色对抽象化角色进行修正;
  • Implementor实现化角色:它是接口或者抽象类,定义角色必须的行为和属性;
  • ConcreteImplementor具体实现化角色:它实现接口或抽象类中定义的方法和属性 ;

桥接模式中的几个角色名词比较拗口,我们只需要记住:抽象角色引用实现角色,或者说抽象角色的部分实现是由实现角色来完成。

三、桥接模式案例分析

下面我们就使用桥接模式来实现前面提到的画图案例,类图如下:

首先我们定义抽象的实现化接口,即代表不同型号的图形类接口:

/*** @Description: 图形类接口* @Date: 2019/10/30 17:56*/
public interface IGraph {/*** 绘制图形的方法*/void drawGraph();
}

抽象图形类接口包含一个绘制图形的方法,下面需要定义出三个抽象图形类的实现:

/*** @Description: 小型号* @Date: 2019/11/2 15:25*/
public class SmallGraph implements IGraph {@Overridepublic void drawGraph() {System.out.println("小图形...");}
}/*** @Description: 大型号* @Date: 2019/11/2 15:25*/
public class LargeGraph implements IGraph {@Overridepublic void drawGraph() {System.out.println("大图形...");}
}/*** @Description: 中型号* @Date: 2019/11/2 15:25*/
public class MiddleGraph implements IGraph {@Overridepublic void drawGraph() {System.out.println("中图形...");}
}

下面我们定义抽象化角色,它内部持有一个指向抽象实现化角色的引用,并定义了一个抽象的画图方法printGraph():

/*** @Description: 图形抽象类* @Date: 2019/11/2 14:46*/
public abstract class AbstractGraph {protected IGraph graph;public void setGraph(IGraph graph) {this.graph = graph;}/*** 绘制图形*/public abstract void paintGraph();}

下面定义出两个表示不同形状的图形类,可以看到,它实现printGraph方法时,部分实现是通过实现化角色来完成的:this.graph.drawGraph():

/*** @Description: 正方形类* @Date: 2019/11/2 15:25*/
public class SquareGraph extends AbstractGraph {@Overridepublic void paintGraph() {this.graph.drawGraph();System.out.println("绘制正方形...");}
}/*** @Description: 长方形* @Date: 2019/11/2 15:27*/
public class RectangleGraph extends AbstractGraph {@Overridepublic void paintGraph() {this.graph.drawGraph();System.out.println("绘制长方形...");}
}

我们看看客户端怎么调用:

/*** @Description: 客户端使用类* @Date: 2019/11/2 14:55*/
public class Client {public static void main(String[] args) {//定义实现化角色IGraph middleGraph = new MiddleGraph();//定义抽象化角色AbstractGraph graph = new RectangleGraph();graph.setGraph(middleGraph);graph.paintGraph();}
}

运行结果如下:

可以看到,将不同型号、不同形状两个维度分开,它们各自都可以自行扩展,使用抽象化角色聚合一个实现化角色的引用,达到解耦的作用。后期如果我们需要增加其他型号、其他形状的图形,我们都不需要修改底层模块,符合开闭原则。

四、总结

桥接模式的优点:

  • 将抽象与实现隔离开,降低耦合度,这是桥接模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式;
  • 提高系统的扩展性,多个维度分别变化,互不影响,后期扩展不需要修改原有代码,符合开闭原则;
  • 提高系统的可维护性,使用桥接模式利用关联替代继承,减少大类的类创建,减少代码量,方便维护;
  • 实现细节对客户透明:客户不用关心细节的实现,它已经由抽象层通过聚合关系完成了封装;

桥接模式的缺点:

  • 使用桥接模式需要认清楚按照哪几个维度进行变化,这很关键;
  • 增加系统的理解与设计难度,由于聚合关系建立在抽象层,要求开发者针对抽象进行设计与编程;

桥接模式的使用场景:

  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系;
  • 不想使用多重继承来增加类数量的情况下可以使用桥接模式;
  • 存在多个维度的变化并且不同维度都会一直变化,后期都可能扩展;

设计模式(八)桥接模式相关推荐

  1. java桥接和装饰_设计模式:桥接模式和装饰模式

    原标题:设计模式:桥接模式和装饰模式 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是&qu ...

  2. C++设计模式之桥接模式

    这篇文章主要介绍了C++设计模式之桥接模式,本文讲解了什么是桥接模式.为什么要使用桥接模式.什么时候使用桥接模式等内容,需要的朋友可以参考下 问题描述 现在要去画一个图形,图形有长方形.圆形和扇形等等 ...

  3. php设计模式之桥接模式

    php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...

  4. java 懒加载模式_JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

    我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Jav ...

  5. 详解设计模式:桥接模式

    桥接模式(Bridge Pattern)也称为桥梁模式.接口模式或者柄体模式,有点像适配器模式,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 桥接模式 是用于把抽象化与实现化解耦,使得二 ...

  6. 设计模式之桥接模式详解

    设计模式之桥接模式详解 文章目录 设计模式之桥接模式详解 一.什么是桥接模式 二.桥接模式的应用场景 三.桥接模式的角色组成 四.桥接模式通用写法示例 五.桥接模式优缺点 一.什么是桥接模式 桥接模式 ...

  7. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  8. java 设计模式之桥接模式,策略模式

    java 设计模式之桥接模式,策略模式 1.引出设计模式 相信大家都玩过王者荣耀这款游戏.我们知道现在大概有九十多个英雄且各自技能及背景故事.台词.被动都不一样而且还带着召唤师技能比如实现,惩戒,弱化 ...

  9. 《设计模式》桥接模式

    <设计模式>设计模式的基本原则 <设计模式>单例模式 <设计模式>工厂模式 <设计模式>原型模式 <设计模式>建造者模式 <设计模式& ...

  10. 八戒转世投胎竟然是Java设计模式:桥接模式

    桥接模式 示例 代码实例 桥接模式 定义 意图 主要解决问题 何时使用 优缺点 八戒转世投胎的故事 示例 请开发一个画图程序,可以画各种颜色不同形状的图形,请用面向对象的思 想设计图形 分析: 1.比 ...

最新文章

  1. java自己实现读写锁_关于读写锁算法的Java实现及思考
  2. TCP/IP协议栈到底是内核态好还是用户态好?
  3. 修改linux绑定的域名,手工修改linux系统下DA面板绑定的域名
  4. Linux常用指令自己备用
  5. c语言 已知某系统在通信联络中,数据结构(习题)..doc
  6. pacs系统服务器配置,pacs系统 服务器配置
  7. SpringBoot中拦截器
  8. 暑假集训 || 网络流
  9. mysql除了两列其他都选_从MySQL的两列中选择不同的名称,然后在单列中显示结果...
  10. Spring Boot 搭建 Eureka Servrer 单机模式、高可用模式
  11. django 用auth的login后重定向
  12. 工具类App原型制作分享-WizNote
  13. 从全息投影到全息平台,必须克服7个障碍
  14. 事业公共基础计算机,2011安徽省事业编公共基础知识(必备资料)
  15. MM物料账在制品承担差异功能及配置
  16. MacBook外置显卡eGPU折腾笔记
  17. Python PaddleNLP实现自动生成虎年藏头诗
  18. php.ini配置中文详解
  19. js新打开页面隐藏地址栏 window.open+iframe
  20. 管道 非阻塞 duxie

热门文章

  1. 算法:24.两两交换链表中的节点
  2. mysql乐观锁和悲观锁的区别_mysql悲观锁和乐观锁的区别
  3. 决策控制方法:sequential 规划、behavior-aware规划、端到端规划
  4. One method of fixing this is to repeatedly uninstall numpy until none is found, then reinstall this
  5. 实高斯随机向量与复高斯随机向量
  6. UML?类图中聚合和组合的区别
  7. 白话machine learning之Loss Function
  8. 计算机组成原理完整学习笔记(二):系统总线
  9. POJ2109-Power of Cryptography
  10. 手撕源码之SpringApplication.java【Spring Boot 2.4.4】