Java 设计模式系列(七)桥接模式
设计模式之美 - 桥接模式
设计模式之美目录:https://www.cnblogs.com/binarylei/p/8999236.html
桥接模式(Bridge):桥接模式不是很好理解,对于这个模式有两种不同的理解方式。但桥接模式并不常用,不是学习的重点。
- 在 GoF 的《设计模式》一书中,桥接模式被定义为:将抽象和实现解耦,让它们可以独立变化。
- 在其他资料和书籍中,还有另外一种更加简单的理解方式:一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。 解决多层继承结构中类无限膨胀的问题。
1. 桥接模式结构
1.1 经典理解方式
在 GoF 的《设计模式》一书中,桥接模式被定义为:将抽象和实现解耦,让它们可以独立变化。怎么理解这名话呢?我们以 JDBC 驱动为例,JDBC 驱动是桥接模式的经典应用。
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/db?user=root&password=123456";
Connection con = DriverManager.getConnection(url);
Statement stmt = con.createStatement();
String query = "select * from test";
ResultSet rs=stmt.executeQuery(query);
while(rs.next()) {
rs.getString(1);
rs.getInt(2);
}
如果我们想要把 MySQL 数据库换成 Oracle 数据库,只需要把第一行代码中的 com.mysql.jdbc.Driver 换成 oracle.jdbc.driver.OracleDriver 就可以了。当然,也有更灵活的实现方式,如 JDK 提供了 SPI 机制可以动态加载不同的实现类。OracleDriver 还是 MysqlDriver 都实现了 java.sql.Driver 接口。

说明: 桥接模式的定义是"将抽象和实现解耦,让它们可以独立变化"。那弄懂定义中 "抽象" 和 "实现" 两个概念,就是理解桥接模式的关键。那在 JDBC 这个例子中,什么是"抽象”?什么是"实现”呢?
- 抽象:本例中就是 JDBC 接口规范。注意,这里所说的 "抽象”,指的并非 "抽象类” 或 "接口”,而是跟具体的数据库无关的、被抽象出来的一套 "类库”,或者说的更直接一点是 "规范"。
- 实现:本例中就是具体的 Driver(com.mysql.jdbc.Driver)。注意,这里所说的 "实现",也并非指 "接口的实现类”,而是跟具体数据库相关的一套 "类库”。JDBC 和 Driver 独立开发,通过对象之间的组合关系,组装在一起。JDBC 的所有逻辑操作,最终都委托给 Driver 来执行。
1.2 组合代替继承
我们可以用多层继承实现下图的关系。
+电脑
+台式机(Desktop)
+联想台式机
+戴尔台式机
+神州台式机
+笔记本(Laptop)
+联想笔记本
+戴尔笔记本
+神州笔记本
+平板电脑(Pad)
+联想平板电脑
+戴尔平板电脑
+神州平板电脑

使用多层继承会形成"电脑 -> 机型 -> 品牌电脑”的继承关系,最终会有 "机型 * 品牌" 个类。随着机型和品牌的增加,类也会膨胀起来,怎么解决这个问题呢?
关键是"联想台式机”这个类既有机型也有品牌两个功能,可以考虑用组合代替继承的方式。

说明: 我们可以抽象出两个维度,品牌和类型两个接口,然后使用组合的方式减少类膨胀的问题,但本质还是面向接口编程,似乎和 GoF 的《设计模式》一书中 "将抽象和实现解耦,让它们可以独立变化" 也很类似。
2. 什么时候使用桥接模式
桥接模式本身并不常用。
桥接模式的优点
实现了抽象和实现部分的分离:理解抽象和实现,是理解桥接模式的核心。
更好的可扩展性:如扩展 MySQL、Oracle 的 Driver 驱动就非常容易。
可动态的切换实现:由于桥接模式实现了抽象和实现的分离,所以可以实现动态切换。
实现细节对客户端透明,可以对用户隐藏实现细节。
桥接模式的缺点
桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。
每天用心记录一点点。内容也许不重要,但习惯很重要!
Java 设计模式系列(七)桥接模式的更多相关文章
- Java设计模式系列之桥接模式
桥接模式(Bridge)的定义 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?这就要使用桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立地 ...
- Java设计模式之《桥接模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...
- Java设计模式系列-抽象工厂模式
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755412.html 一.概述 抽象工厂模式是对工厂方法模式的再升级,但是二者面对的场景稍显差别. ...
- Java设计模式系列-工厂方法模式
原创文章,转载请标注出处:<Java设计模式系列-工厂方法模式> 一.概述 工厂,就是生产产品的地方. 在Java设计模式中使用工厂的概念,那就是生成对象的地方了. 本来直接就能创建的对象 ...
- Java设计模式系列-装饰器模式
原创文章,转载请标注出处:<Java设计模式系列-装饰器模式> 一.概述 装饰器模式作用是针对目标方法进行增强,提供新的功能或者额外的功能. 不同于适配器模式和桥接模式,装饰器模式涉及的是 ...
- 重学 Java 设计模式:实战桥接模式(多支付渠道「微信、支付宝」与多支付模式「刷脸、指纹」场景)
作者:小傅哥 博客:https://bugstack.cn - 编写系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么你的代码那么多ifelse 同类的业务.同样的功能, ...
- Java设计模式学习记录-桥接模式
前言 这次介绍结构型设计模式中的第二种模式,桥接模式. 使用桥接模式的目的就是为了解耦,松散的耦合更利于扩展,但是会增加相应的代码量和设计难度. 桥接模式 桥接模式是为了将抽象化与实现化解耦,让二者可 ...
- 《Java设计模式》之桥接模式
Bridge模式的概念 Bridge 模式是构造型的设计模式之中的一个.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abst ...
- java设计模式之十桥接模式(Bridge)
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...
- java设计模式-----14、桥接模式
Bridge 模式又叫做桥接模式,是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstraction ...
随机推荐
- os、os.path、shutil操作文件和文件路径的常用方法总结
os模块是python标准库中的一个用于访问操作系统功能的模块,下面简要介绍一下常用的命令 1.os.name(). 判断现在正在使用的平台,windows返回’nt’,Linux返回‘posi ...
- vue中去掉url地址栏中的#符号
要去掉vue中访问地址中的#符号可以在路由器中设置路由模式为history: export default new Router({ mode:'history', routes: [ { path: ...
- 在做私密相冊的SDK,奇怪的是在ios6上项目里的navigationbar能够传进来一直往下传,但在ios7上却仅仅能够传一层,原来答案在下边
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/chenyong05314/article/details/33867247 //若不加这一句 在IO ...
- hibernate流程图
流程图: 作者: IT程序狮 链接:http://www.imooc.com/article/1296来源:慕课网
- 开始SDK之旅-入门1基本环境搭建与测试
已验证这个可用. http://bbs.ccflow.org/showtopic-2560.aspx 集成方式已经用一段时间了,今天刚好有时间,尝试下SDK.使用的话,也很方便,以下是简单的步骤1.新 ...
- sql server获取插入记录后的ID
select @@IDENTITY --返回为当前会话的所有作用域中的任何表最后生成的标识值. select IDENT_CURRENT('table_name') --返回为任何会话和任何作用域中的 ...
- SlickEdit V21 2016 破解教程,win linux mac
最近主要工作系统转到LInux上面来了,Slickedit的安装破解也费了些事,今天将过程整理一下做个记录. 说明:SlickEdit pro V21.03 Linux 64位实测可用,MAC实测可用 ...
- mysql-5null值处理
值为null遇到的问题: 1.使用select对数据进行处理时,如果有格值为null,该命令会无法正常工作.如示例一 2.使用where限定条件时,null值不能处理.如示例二 -- 新建一张表,并填 ...
- CentOS下查看最后登录的用户信息以及LOG记录
CentOS下查看最后登录的用户信息tail /var/log/messagestail /var/log/secure 我们知道,在redhat下可以用lastlog查看各用户最后登录的信息,用la ...
- iOS - Properties 入门
iOS中,类的属性property可以有若干个修饰词,对应不同的属性行为. @property (readonly) NSString *readonly; // 只读,不可修改 @property ...