前言

在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用Bridge模式。桥接模式在我们很多框架中都能看到,比如spring的JdbcTemplate

本节,我们就桥接模式,展开详细介绍。

1. 桥接模式中的角色

1.1 抽象化(Abstraction)角色:

定义抽象类,并包含一个对实现化对象的引用。

1.2 扩展抽象化(Refined Abstraction)角色:

抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。

1.3 实现化(Implementor)角色:

定义实现化角色的接口,供扩展抽象化角色调用。

1.4 具体实现化(Concrete Implementor)角色:

给出实现化角色接口的具体实现。

2. 代码示例

本文以点咖啡为例,咖啡有大小杯,和加奶,加糖两个维度。

2.1 定义抽象化角色(咖啡)

package com.wanlong.design_pattern.structure.bridge;/*** @author wanlong* @version 1.0* @description: 抽象化角色,咖啡* @date 2022/9/15 17:40*/public abstract class Coffee {protected ICoffeeAdditives additives;public Coffee(ICoffeeAdditives additives) {this.additives = additives;}public abstract void orderCoffee(int count);
}

2.2 定义扩展抽象化角色

2.2.1 定义抽象化角色(大杯咖啡)

package com.wanlong.design_pattern.structure.bridge;/*** @author wanlong* @version 1.0* @description: 扩展抽象化角色(大杯咖啡)* @date 2022/9/15 17:42*/
public class LargeCoffee extends Coffee {public LargeCoffee(ICoffeeAdditives additives) {super(additives);}@Overridepublic void orderCoffee(int count) {additives.addSomething();System.out.println("大杯咖啡" + count + "杯");}
}

2.2.1 定义抽象化角色(小杯咖啡)

package com.wanlong.design_pattern.structure.bridge;/*** @author wanlong* @version 1.0* @description: 扩展抽象化角色(小杯咖啡)* @date 2022/9/15 17:42*/
public class SmallCoffee extends Coffee {public SmallCoffee(ICoffeeAdditives additives) {super(additives);}@Overridepublic void orderCoffee(int count) {//小杯咖啡,加东西additives.addSomething();System.out.println("小杯咖啡" + count + "杯");}
}

2.3 定义实现化角色(加什么)

package com.wanlong.design_pattern.structure.bridge;/*** @Description:实现化角色,供扩展抽象化角色调用。* @Author: wanlong* @Date: 2023/5/14 12:47**/
public interface ICoffeeAdditives {void addSomething();
}

2.4 定义具体实现化角色(奶还是糖)

2.4.1 定义具体实现化角色(奶)

package com.wanlong.design_pattern.structure.bridge;/*** @author wanlong* @version 1.0* @description: 实现具体化角色* @date 2022/9/15 17:41*/public class Milk implements ICoffeeAdditives {@Overridepublic void addSomething() {System.out.println("加奶");}
}

2.4.2 定义具体实现化角色(糖)

package com.wanlong.design_pattern.structure.bridge;/*** @author wanlong* @version 1.0* @description: 具体实现化角色* @date 2022/9/15 17:41*/public class Sugar implements ICoffeeAdditives {@Overridepublic void addSomething() {System.out.println("加糖");}
}

2.5 客户端测试

@Test
public void testBridge() {//点两杯加奶的大杯咖啡LargeCoffee largeWithMilk = new LargeCoffee(new Milk());largeWithMilk.orderCoffee(2);System.out.println("============这是一条华丽的分割线==========");//点三杯加糖的小杯咖啡new SmallCoffee(new Sugar()).orderCoffee(3);
}

代码运行结果:

加奶
大杯咖啡2杯
============这是一条华丽的分割线==========
加糖
小杯咖啡3杯

后面需要加其他口味,只需要像牛奶和糖一样,新增具体实现类即可,客户端调用即可,不需要修改原来的类

3. 总结

3.1 优缺点

3.1.1 优点

  1. 分离抽象与实现 : 分离抽象部分和具体实现部分
  2. 抽象和实现不在同一个继承层次中 , 可以动态的将抽象的子类对象和实现的子类对象进行组合 ,通过进行组合 , 可以获得多维度的组合对象 ;
  3. 提高扩展型 : 提高了系统的可扩展性 ;
  4. 解耦了抽象与实现 :桥接模式使用组合关系解耦了抽象和实现之间的继承关系 。抽象与实现二者可以沿着自己的维度继续自行进行扩展 , 不需要改变系统原有的功能 ;
  5. 符合开闭原则 ;
  6. 符合合成复用原则 ;

3.1.2 缺点

  1. 系统复杂 : 增加了 系统的 理解 与 设计难度 ;
  2. 识别变化维度 : 需要正确地 识别出 系统中 , 两个独立变化的 维度 ;
  3. 桥接模式的使用范围 , 有一定的局限性 ;

3.2 常用场景

  1. 抽象实现灵活 : 抽象和具体实现之间 , 需要增加更多灵活性的情况下 , 适合使用桥接模式 ;
  2. 独立变化维度 : 一个类存在两个或更多的独立变化维度 , 并且这些维度都需要 独立扩展 。抽象部分可以独立扩展 , 具体实现的部分 , 也可以独立扩展 ;
  3. 不使用继承 : 不希望使用继承 , 或 因多层继承导致系统类的个数增加 ;
  4. 使用桥接模式 , 可以 避免在这两个层次之间 , 建立静态的继承关系 , 通过 桥接模式 在二者之间建立 关联关系 ;

3.3 桥接模式和组合模式比较

  1. 组合模式更强调部分与整体间的组合
  2. 桥接模式 更强调平行级别上,不同类的组合

3.4 桥接模式和适配器模式比较

3.4.1 共同点

都是让两个类配合工作 ;

3.4.2 不同点

  1. 二者目的不同
  2. 适配器模式是改变已有接口,让二者之间相互配合,目的是配合 ;
  3. 桥接模式分离抽象和具体的实现 , 目的是分离桥接模式最重要的是将抽象与实现解耦 , 通过组合在抽象与实现 之间搭建桥梁 ;

以上,本人菜鸟一枚,如有问题,请不吝指正。

10.设计模式之桥接模式相关推荐

  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. java 设计模式之桥接模式,策略模式

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

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

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

  9. 设计模式之桥接模式(Bridge)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

最新文章

  1. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round J
  2. PPT 下载 | 神策数据徐美玲:如何挖好数据这座矿?
  3. 09-Flutter移动电商实战-移动商城数据请求实战
  4. 表单中Readonly和Disabled的区别
  5. memcached并发CAS模式
  6. python两数相加有进退位_仁裁者、Python之父Guido“退位”,python何去何从?
  7. 《HTML5 Canvas游戏开发实战》——3.3 自定义画板
  8. Sublime Text 3运行JavaScript控制台
  9. 具体解说Android的图片下载框架UniversialImageLoader之磁盘缓存(一)
  10. 边工作边刷题:70天一遍leetcode: day 34-1
  11. 如何关闭AutoCAD2016上的“开始”界面、打开CAD就自动新建一个drawing1、“文件”选项卡?
  12. 【ANSYS命令流】模型的建立相关命令(一)
  13. UBUNTU16.04使用CornerNet_Lite进行目标识别并嵌入到ROS中
  14. 四轴笔记----PSRAM存储器介绍
  15. docker oxidized时区问题,时间显示不是北京时间问题的解决办法
  16. gamemaker: studio html5,HTML5 Game Development with Gamemaker
  17. MongoDB 日志管理
  18. 2020美团笔试部分题解(4.9)
  19. 面向汽车企业的PLM知识管理
  20. Delaunay三角剖分

热门文章

  1. 火星人-洛谷 1088
  2. npm 安装报错 npm ERR! code Z_BUF_ERROR 问题解决
  3. linux centos livecd,定制自己的LiveCD,依托(centos)
  4. Android 图片选择框架ImageSelector适配Android10及以上
  5. 无状态密码管理器Heimdallr
  6. 精致的动画特效源代码
  7. CV计算机视觉(computer vision)概述--个人理解
  8. 解决电脑不能被局域网内的其它电脑访问的方法
  9. 使用苹果地图定位地理信息反编码 遇到 Error Domain=kCLErrorDomain Code=8 问题
  10. ECharts周围空白的地方太多了,如何解决