本文主要介绍:桥接模式概念和用法。

模式背景

生活中,我们如果一个笔有三种型号:大,中,小。颜色一共有M种。如果需要所有型号都有相对应的颜色,那么就需要3*M只笔。但是如果我们转换一下:M种颜色代表M种墨水,笔的三种型号就对应三支笔,那么只需要3+M个,然后组合就可以得到相同的结果,这种思维模式就是桥接。

应用到项目中,当系统中一些类存在多个独立变化的维度(注意2点:独立,变化维度),我们可以使用桥接模式来大大减少系统的中的类。如果不使用桥接模式,一般来说我们会形成一个庞大的继承系统(见下面的图2),这些变化的维度将耦合在一起,对于扩展什么的也会极为不便(无论是我们现在需要增加一个颜色,还是增加一个笔型号,势必都要添加大量的类)。

定义&概念

桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。

原理

如上面提到的,桥接模式需要先能分出系统中那些独立变化的维度,然后我们再进行分离。桥接模式的思想就是如何进行分离的过程。

所有设计模式的思想其实都希望我们更多的去利用组合,而不是继承。所以桥接模式的主要思想就是:将变化的维度抽象为不同的继承体系,每一个维度是自己的一个继承体系,然后通过组合将所需要的这些变化维度拼接为最后的对象。这维度和维度之间的联系组合我们把它称为桥。如下图Color和Pen之间就是一座桥,这个桥所连接是两个继承体系。两个继承体系独立变化。桥接模式主要是用来处理多维度变化的。

组成要素

抽象类(Abstraction)

将原来的那个设计多维度的变化的对象。这个抽象类主要担当接口的作用!用来多态其实现类的。

抽象类的扩充(RefinedAbstraction)

也可以理解为抽象类的具体实现类。他相当于就完成各种变化的最终组合的实现类,组合方式就是调用桥的另一个组合对象来动态完成组合的。我们可以将其中一种变化放入到该抽象类实现中去。比如上面Pen的大小。这样Pen内部通过多态的Color来组合不同的情况。

实现类接口(Implementor)

定义实现类的接口,是桥的另一端的继承体系的祖宗。只封装一个变化。

实现类的具体实现类(ConcreteImplementor)

就是该维度变化的各种情况的实现。

UML

生活模型

如果不使用桥接模式,就可能形成这样的继承体系。

使用了桥接模式

系统模型

实现

/**

* 抽象类

*/

abstract class Pen{

Color color;

public void setColor(Color color){

this.color = color;

}

abstract void size();

}

/**

* 某个变化维度的接口

*/

interface Color{

void color();

}

/**

* 变化维度接口的实现

*/

class Red implements Color{

@Override

public void color(){

System.out.println("red");

}

}

class Black implements Color{

@Override

public void color(){

System.out.println("black");

}

}

class Blue implements Color{

@Override

public void color(){

System.out.println("blue");

}

}

/**

* 抽象类的具体实现

*/

class Pen1 extends Pen{

@Override

void size(){

color.color();

System.out.println("size:1");

}

}

class Pen2 extends Pen{

@Override

void size(){

color.color();

System.out.println("size:2");

}

}

复制代码

使用

Pen p = new Pen1();

Color c = new Red();

p.setColor(c);

p.size();

复制代码

优缺点

整体来看,桥接模式的优缺点如下:

优点

解耦了继承体系。

分离抽象接口及其实现部分。提高了比继承更好的解决方案。

提高系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原代码。

缺点

增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

要求正确识别出系统中变化的维度,这让其使用范围具有一定的局限性。

使用场景

存在着独立的变化维度,且这些维度都需要进行扩展。

当我们系统中使用继承的时候,如果发现继承体系是可以继续拆分的,那么就使用桥接进行拆分。

是实现java虚拟机和jdbc这些程序的核心设计模式之一。

最好的就是和笔+油墨这类性质问题,那么就使用桥接模式。

总结

系统存在多个相互独立的变化维度,使用桥接第一步就是先分清这些维度。

每个维度一个继承体系,比如笔是一个继承体系,颜色是一个继承体系。最后使用组合拼成最终对象。

当系统中有一个继承体系庞大,你可以考虑看看这个继承是否可以按照维度进行拆分,然后使用桥接来组合。

桥接模式不是一个复杂的模式,他的工作就2个:按维度建立继承体系,将不同体系连一起(称为桥接)。

扩展

和适配器模式连用

桥接模式是设计初期的,适配器模式是可能开发中期的。他们位于系统设计的不同阶段。当我们发现现有的类和我们正在开发的系统无法协同工作就可以使用适配器模式。而所适配的可能就是桥接的某个维度接口的某个功能实现。比如:一个系统的数据采集可以有文本,csv,数据库,我们有现成的数据库的连接库,这时候就要一个适配器来适配这个库,并实现数据采集的接口来实现桥接。

如有代码和文章问题,还请指正!感谢!

android 桥梁模式,【设计模式】桥接模式相关推荐

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

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

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

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

  3. 设计模式——桥接模式实验报告

    目录 设计模式--桥接模式实验报告 一.实验题目 二.所用模式结构视图 三.本实例类图 四.实例实现代码 1.抽象消息类 2.普通消息类 3.加急消息类 4.特急消息类 5.实现发送消息的统一接口: ...

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

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

  5. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  6. 一起学设计模式 - 桥接模式

    桥接模式(Brideg Pattern)属于结构型模式的一种,用于把抽象化与实现化解耦,使得二者可以独立变化,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. <!-- more -- ...

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

    文章目录 一.使用场景 二.实现方法 三.优势与劣势 四.经典案例 本文笔记来自于: 狂神的设计模式 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化.它是一种对象结构模型,又称为柄体( ...

  8. 【设计模式学习笔记】组合模式与桥接模式案例详解(C++实现)

    目录 一.组合模式 1. 什么是组合模式 2. 组合模式案例 二.桥接模式 1. 什么是桥接模式 2. 桥接模式案例 一.组合模式 1. 什么是组合模式 Composite Pattern,组合模式, ...

  9. 设计模式--桥接模式(Bridge)

    设计模式–桥接模式(Bridge) 1.定义 桥接模式:将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.实例 设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图 ...

  10. 设计模式自学笔记007_Real(命令模式、备忘录模式、桥接模式)

    设计模式自学笔记007_Real(命令模式.备忘录模式.桥接模式) 一.命令模式 在软件设计的过程中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道请求的操作是哪个.我们只需要 ...

最新文章

  1. Exchange管理控制台无法安装,要求重新启动
  2. GdiPlus[21]: IGPPathGradientBrush 之 InterpolationColors
  3. boost::dijkstra_shortest_paths_no_color_map用法的测试程序
  4. C#中实现js中的eval函数功能
  5. bundle 安装_超级小白使用pip安装第三方库的正确姿势
  6. Mac下安装Flink的local模式(flink-1.5.2)
  7. HTML编程之利用jquery制作长图动画的方法
  8. springMvc 使用ajax上传文件,返回获取的文件数据 附Struts2文件上传
  9. python中oo是什么意思_00.Python学习笔记
  10. mysql 外键 150_mysql之创建外键报150错误的处理方法
  11. Filebeat — harvester、input
  12. 火车票能不能选座_12306可以选座位吗 12306怎么选座位方法介绍
  13. Scala特质trait
  14. 计算机组成原理实验内存读数,计算机组成原理实验八内存系统实验(3页)-原创力文档...
  15. 针对MacBook提示目前翻译不可用请稍后再试的解决方法
  16. 解决影驰固态硬盘SSD卡顿
  17. 网站黑白色调之filter属性
  18. 【第29题】有 1、2、3、4 个数字,能组成多少个互不相同且无重复数字的三位数
  19. Java实现第八届蓝桥杯青蛙跳杯子
  20. Matlab怎么从table变成matrix

热门文章

  1. 用户登录界面(Bootstrap)入门教程01(适合初学者)
  2. 2021年五月下旬推荐文章
  3. Linux TCP/IP网络协议栈:IP协议源码分析
  4. Linux mcheck机制检测内存溢出、内存越界
  5. linux驱动之可加载模块
  6. Linux之hugepage大页内存理论
  7. 【HTML+CSS网页设计与布局 从入门到精通】第9章-选择器
  8. android 自定义控件linearlayout,自定义控件(瀑布流,LinearLayout)
  9. mysql left join和or_Case:MySQL使用left join的时候or改写成union可以提高效率
  10. 调用远程摄像头进行人脸识别_工地安全:AI如何实现安全帽检测与人脸识别?...