参考:https://blog.csdn.net/weixin_48052161/article/details/119188465?spm=1001.2014.3001.5501
桥接模式:
桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。

生活案例:
在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有m×n种,不但对应的子类很多,而且扩展困难。
相机可以按,品牌(索尼,佳能等)和相机类型(单反,微单,卡片机等)两种维度去组合结果
抽象类在发展 实现类也在发展
需求:
一个哥哥要送妹妹礼物,但知道选什么样的礼物,产生烦恼

礼物可以抽象划分可以分为温柔的礼物和狂野的礼物 WarmGift ,WildGift
礼物按实际类别又可以分为书本和花朵Book,Flower
不同的分类,有不同的表达:按礼物的大的方向,可以对礼物类进行分类,而按照礼物具体的本身又有不同的分类:接口里面套接口

即:实际需求 可能Flower又可以分为WarmFlower ,WildFlower.
书本也可以分为WarmBook ,WildBook.
如果再有别的礼物,比如抽象类型:ToughGift ColdGift
或者具体的某种实现:Ring Car
抽象类在发展 实现类也在发展…
全都用继承的话就会产生类的爆炸 WarmCar ColdRing WildCar WildFlower …
使用桥接模式:
分离抽象与具体实现,让他们可以独自发展
用聚合 代替继承

代码阐述:
原理:礼物的抽象类里面聚合了礼物的实现接口,即

package com.example.dtest.design24.bridgeMode;public abstract class Gift {GiftImpl impl;}

实现抽象分类的类:

package com.example.dtest.design24.bridgeMode;public class WarmGift extends Gift {public WarmGift(GiftImpl impl){this.impl = impl;}public WarmGift(){}}
package com.example.dtest.design24.bridgeMode;public class WildGift extends Gift {public WildGift(GiftImpl impl){this.impl = impl;}public WildGift(){}}

礼物的具体分类接口:

package com.example.dtest.design24.bridgeMode;public interface GiftImpl {}

实现具体分类的类:

package com.example.dtest.design24.bridgeMode;public class Book implements GiftImpl{}
package com.example.dtest.design24.bridgeMode;public class Flower implements GiftImpl{}

最后测试实现不同抽象分类实现不同的具体实体类:

package com.example.dtest.design24.bridgeMode;public class BridgeModeTest {public static void main(String[] args) {//温柔的花  WarmFlowerGift g = new WarmGift(new Flower());//野性的书本 WildBookGift g1 = new WildGift(new Book());}}

总结:即把抽象分类的抽象类,和具体实现的接口以聚合方式连体(即实现类的接口以属性方式放在顶层抽象类的属性里面),最后构造器将具体的类放在实现抽象类的类里面。桥接:即桥梁的意思,则有一个类承担了输入和输出的不同性,即这个类输入的是该类的具体的实现,但输出的是抽象的大实现或者顶层抽象,又或者输出的是一致的某一个接口

扩展:JDBC中使用的桥接模式:
JDBC为所有的关系型数据库提供一个通用的界面。一个应用系统动态地选择一个合适的驱动器,然后通过驱动器向数据库引擎发出指令。
我们知道jdbc只提出了一系列接口规范,具体的实现由数据库提供者去实现。所以,当我们在连接mysql的时候,需要添加jdbc-mysql.jar,在连接oracel的时候,需要添加ojdbc.jar。然后去载入驱动,再进行连接.

代码:

package com.example.dtest.jdbc;import org.springframework.stereotype.Component;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;@Component
public class JdbcConnection {public static Connection getConn() {String driver = "com.mysql.jdbc.Driver";String url = "jdbc:mysql://42.192.41.114:3306/dblogs";String username = "root";String password = "123456";Connection conn = null;try {Class.forName(driver); //classLoader,加载对应驱动conn = (Connection) DriverManager.getConnection(url, username, password);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;}}
com.mysql.jdbc.Driver 源码:
import java.sql.DriverManager;
import java.sql.SQLException;public class Driver extends NonRegisteringDriver implements java.sql.Driver {public Driver() throws SQLException {}static {try {DriverManager.registerDriver(new Driver());} catch (SQLException var1) {throw new RuntimeException("Can't register driver!");}}
}

Class.forName会把类加载进来,执行类的静态方法(类加载的初始化阶段)。我们看到mysql Driver的static块,调用了java.sql.DriverManager的registerDriver方法来注册驱动。
当驱动注册完成后,我们就会开始调用DriverManager中的getConnection方法获取数据库连接对象Connection
在Java中通过Connection提供给各个数据库一样的操作接口,这里的Connection可以看作抽象类
所以这里 Driver(数据库驱动接口)
和Connection(数据库连接接口)之间
是通过DriverManager类进行桥接的


总结:即把抽象分类的抽象类,和具体实现的接口以聚合方式连体(即实现类的接口以属性方式放在顶层抽象类的属性里面),最后构造器将具体的类放在实现抽象类的类里面。桥接:即桥梁的意思,则有一个类承担了输入和输出的不同性,即这个类输入的是该类的具体的实现,但输出的是抽象的大实现或者顶层抽象,又或者输出的是一致的某一个接口

23种设计模式--桥接模式(Bridge)相关推荐

  1. 23种设计模式——桥接模式

    文章目录 23种设计模式--桥接模式 1.桥接模式概述 2.桥接模式结构 3.桥接模式的实现 4.桥接模式的注意事项和细节 23种设计模式--桥接模式 1.桥接模式概述 桥接模式介绍 桥接(Bridg ...

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

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

  3. 23种设计模式----------代理模式(一)

    代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者 ...

  4. 23种设计模式-工厂模式

    23种设计模式-工厂模式 前言: [我们为什么需要使用工厂模式?] /*** 在使用工厂模式之前,我们要创建 实现了相同接口的对象 都需要直接new(),如下* */@Testpublic void ...

  5. 23种设计模式——工厂模式

    文章目录 23种设计模式--工厂模式 1.工厂模式概述 2.简单工厂模式 2.1.简单工厂模式的优缺点 2.2.简单工厂模式的结构 2.3.简单工厂模式的实现 3.工厂方法模式 3.1.工厂方法模式的 ...

  6. 23种设计模式常用模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过 ...

  7. SSM源码分析之23种设计模式(策略模式和模板模式)

    23种设计模式之策略模式和模板模式 目录 策略模式使用场景 策略模式实现 模板模式 目录 策略模式使用场景 策略模式:根据用户的需求处理数据时候需要对算法做出选择,固定的一些算法(不再发生变化的算法) ...

  8. 23种设计模式----模板方法模式----行为模式

    模板方法模式 1.模板方法模式是什么 2.模板方法的组成 3.模板方法中不同的类的行为 4.例子 4.1 例子的背景 4.2模板类--父亲寻找继承人的方式 4.3实现类----孩子类 4.4测试类-- ...

  9. 23种设计模式----原型模式----创建型模式

    原型模式 1.1什么是原型模式 1.2为什么要使用原型模式 2.原型模式的解释 3.例子 3.1例子将要实现的目标 3.2例子设计 3.3原型类 3.4具体实现的3个原型实例类 3.5管理类 3.6工 ...

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

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初始桥接 ...

最新文章

  1. 这届 AI 预测欧洲杯冠军,通通被打脸
  2. pt,px,rem和em之间区别总结
  3. 人工智能项目开发规划与准备
  4. oracle导出库压缩参数,oracle数据库的定时备份:导出 压缩 归类
  5. 【多媒体内容与体验创新】
  6. php 等值线,【地理】攻克等值线的六大法门
  7. CSS:CSS 在工程中改变——面向对象的CSS (OO CSS)
  8. java中的==和equals的区别
  9. 自动驾驶1-4 驾驶分类Taxonomy of Driving
  10. 第一节、网络安全术语解释
  11. 使用SSH工具链接本地虚拟机
  12. 普歌-nuxt.js基础
  13. Unity5.6——VideoPlayer播放
  14. 计算机硬件配件怎么查,如何查看计算机主板型号?主板型号在哪里[方法]
  15. 《艺多不压身 艺多不养家》反思
  16. python-docx库实战修改word文档格式
  17. Oracle兵器谱上古神器之-KFED
  18. Map与Json之间的转化
  19. css 设置文字强制不换行
  20. 企业上云模式正发生转变,混合云或成产业新风口|中机智库干货

热门文章

  1. LOGO以及手绘签名完美导入CAD
  2. ISP对pptpd及1723端口的动态管控初探
  3. tm影像辐射定标_ENVI中TM的辐射定标和大气校正
  4. Android武林大会(转)
  5. 无法启动此程序因为计算机中丢失adapt,【完美解决】Wi7中NVIDIA GT540M安装程序无法找到和你现有硬件兼容的任何驱动程序,安装程序将会退出.doc...
  6. jQuery创建表格
  7. Could not autowire. No beans of 'Iface' type found. less... (Ctrl+F1) Inspection info:Checks autowi
  8. Python 分位数回归
  9. 什么是王道?什么是王道中的王道?
  10. python写邮箱系统登录_Python selenium登录163邮箱示例