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 ...
随机推荐
- 7-17 Hashing(25 分)
The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...
- flask第二十四篇——模板【6】自定义过滤器
请关注孟船长的公众号:自动化测试实战 大家想了解其他过滤器可以参考这里: http://jinja.pocoo.org/docs/dev/templates/#builtin-filters ---- ...
- Struts2自定义标签4自定义分页标签
第一步:webroot/web-inf下的str.tld文件 <?xml version="1.0" encoding="UTF-8"?> < ...
- NET怎么精确计算一个对象占用的内存空间(GMK)
NET如何精确计算一个对象占用的内存空间(GMK)如题 我最近做了一个类似Session的东西 但是我不知道最后管理起来他又多大 所以内存 对象 管理 session 类 分享到: ------解决方 ...
- jenkins初始化配置完后设置了管理员账号密码 网页停留时间长了刷新登录不了了
好像陆陆续续在几台机子安装到最后正式使用的这台机器都是这样.难道是它自己本身的问题吗?只能网上帖子凑了. 找到.jenkins/config.xml文件:(windows环境就是和initialsec ...
- Oracle使用startup与startup force启动的区别
1. startup 就是正常启动数据库,没什么好说的. 2. startup force 是shutdown abort + startup的组合,即强制关闭数据库+ 正常启动数据库,想快速重启数据 ...
- Erlang Web 监控工具
转自http://www.cnblogs.com/me-sa/archive/2012/04/17/erlang-web-monitor.html Erlang已经提供了一系列工具查看运行时状态查看 ...
- 安装memcached服务 和 php 安装memcache扩展
这是所有的命令,至于哪个命令是干嘛的自己悟去吧 ,顺便穿插一些知识点 安装libevent cd /home/ wget http://www.monkey.org/~provos/libeven ...
- Java-Web 用html和css写一个EasyMall注册界面
要求: html代码: <!DOCTYPE html> <html> <head> <title>EasyMall注册页面</title> ...
- 熟练的使用CIFAR-10数据集
CIFIR-10是一套包含60000张,大小为32x32的十分类图片数据集,其中50000张被分为训练数据,10000张被分为测试数据,http://www.cs.toronto.edu/~kriz/ ...