桥接模式:探索JDBC的接口
一、目录概要

二、问题探究
需求:假设要设计一个电脑商场管理系统的某个模块设计,电脑分为品牌和类型两个纬度,我们应该怎么解决?
按照初学者的思路,利用继承就能简单粗暴的实现,那我们来看下这种思路的设计类图。

从电脑纬度划分
package com.aaron.bridge;
public interface Computer {
public void sale();
}
class Desktop implements Computer{
@Override
public void sale() {
System.out.println("台式电脑");
}
}
class Laptop implements Computer{
@Override
public void sale() {
System.out.println("笔记本电脑");
}
}
class Pad implements Computer{
@Override
public void sale() {
System.out.println("平板电脑");
}
}
从品牌纬度划分
package com.aaron.bridge;
// 宏碁品牌的三种类型
public class AcerDesktop extends Desktop{
@Override
public void sale() {
System.out.println("宏碁台式机");
}
}
class AcerLaptop extends Laptop{
@Override
public void sale() {
System.out.println("宏碁笔记本电脑");
}
}
class AcerPad extends Pad{
@Override
public void sale() {
System.out.println("宏碁平板电脑");
}
}
package com.aaron.bridge;
// 苹果品牌的三种类型
public class AppleDesktop extends Desktop{
@Override
public void sale() {
System.out.println("苹果台式机");
}
}
class AppleLaptop extends Laptop{
@Override
public void sale() {
System.out.println("苹果笔记本电脑");
}
}
class ApplePad extends Pad{
@Override
public void sale() {
System.out.println("苹果平板电脑");
}
}
package com.aaron.bridge;
//戴尔品牌的三种类型
public class DellDesktop extends Desktop{
@Override
public void sale() {
System.out.println("戴尔台式机");
}
}
class DellLaptop extends Laptop{
@Override
public void sale() {
System.out.println("戴尔笔记本电脑");
}
}
class DellPad extends Pad{
@Override
public void sale() {
System.out.println("戴尔平板电脑");
}
}
问题1:假设我们的系统按照上述思路设计,当我们新增一个品牌的时候,怎么办?
根据上述思路,从品牌纬度扩展品牌时直接新增台式机、笔记本电脑、平板电脑的类即可。
问题2:当我们新增一个机器类型的时候又该怎么办?
根据上述思路,在机器纬度类型扩展。
- 添加新的电脑机型。
- 在所有的品牌中,都新增新的机型。
package com.aaron.bridge;
// 电脑纬度
public interface Computer {
public void sale();
}
class Desktop implements Computer{
@Override
public void sale() {
System.out.println("台式电脑");
}
}
class Laptop implements Computer{
@Override
public void sale() {
System.out.println("笔记本电脑");
}
}
class Pad implements Computer{
@Override
public void sale() {
System.out.println("平板电脑");
}
}
class MaxPad implements Computer{
@Override
public void sale() {
System.out.println("超大屏电脑");
}
}
// 品牌纬度
public class DellDesktop extends Desktop{
@Override
public void sale() {
System.out.println("戴尔台式机");
}
}
class DellLaptop extends Laptop{
@Override
public void sale() {
System.out.println("戴尔笔记本电脑");
}
}
class DellPad extends Pad{
@Override
public void sale() {
System.out.println("戴尔平板电脑");
}
}
class DellPad extends Pad{
@Override
public void sale() {
System.out.println("戴尔平板电脑");
}
}
class DellMaxPad extends Pad{
@Override
public void sale() {
System.out.println("超大屏平板电脑");
}
}
思考:当我们添加少量的机型和品牌的时候,该方案的代码扩展性还是可以接受的。但是,再往远思考一步。
- 假设电脑商城,添加10个品牌,再添加10种机型,怎么办?
- 系统已经上线,系统处于维护阶段人力有限,怎么办?
问题:上述问题主要是把电脑和品牌两个纬度耦合。
- 违背单一职责原则(一个类只由一个维度影响)
- 违背开闭原则(对拓展开放,对修改关闭)。
解决:将机器、品牌两个纬度进行拆分,不要将他们耦合。
三、解决思路
3.1 什么是桥接模式?
将两个维度(抽象、实现)分离,使它们都可以独立地变化。
3.2 桥接模式的分析
- 类型:台式机、笔记本电脑、平板电脑。
- 品牌:宏碁、苹果、戴尔。
关键:将上述问题拆分成两个纬度类型和品牌。我们刚刚也讨论了,主要解决拓展性问题。当添加一个新的机器类型或者品牌的时候,不会对其他机器类型或者品牌产生影响。
概念:简单谈下概念,重点根据类图和实现代码去理解Abstraction、RefinedAbstraction、Implementor、ConcreteImplementor
Abstraction:抽象部分的接口。通常在这个对象里面,要维护一个实现部分的对象引用,在抽象对象里面的方法,需要调用实现部分的对象来完成。这个对象里面的方法,通常都是跟具体的业务相关的方法。
RefinedAbstraction:
扩展抽象部分的接口,通常在这些对象里面,定义跟实际业务相关的方法,这些方法的实现通常会使用Abstraction中定义的方法,也可能需要调用实现部分的对象来完成。
Implementor:
定义实现部分的接口,这个接口不用和Abstraction里面的方法一致(根据约定优于配置原则,建议跟Abstraction一致。),通常是由Implementor接口提供基本的操作,而Abstraction里面定义的是基于这些基本操作的业务方法,也就是说Abstraction定义了基于这些基本操作的较高层次的操作。
ConcreteImplementor:
真正实现Implementor接口的对象。

3.3 桥接模式实现
1、实体部分设计
package com.aaron.bridge;
/**
*
* @author xiaoyongAaron
* 品牌纬度-实现部分接口
*/
public interface ImplementorBrand {
public void sale();
}
class ConcreteImplementorAcer implements ImplementorBrand{
@Override
public void sale() {
System.out.println("宏碁品牌");
}
}
class ConcreteImplementorApple implements ImplementorBrand{
@Override
public void sale() {
System.out.println("苹果品牌");
}
}
class ConcreteImplementorDell implements ImplementorBrand{
@Override
public void sale() {
System.out.println("戴尔品牌");
}
}
2、抽象部分设计
package com.aaron.bridge;
/**
* 机器类型纬度-抽象部分
* @author xiaoyongAaron
*/
public class AbstractionComputer {
protected ImplementorBrand brand;
public AbstractionComputer(ImplementorBrand brand){
this.brand=brand;
}
public void sale(){
brand.sale();
};
}
/**
* 扩展部分
* @author xiaoyongAaron
*/
class RefinedAbstractionDesktop extends AbstractionComputer{
public RefinedAbstractionDesktop(ImplementorBrand brand) {
super(brand);
}
@Override
public void sale() {
//添加自己的特性,实际业务。
paly();
super.sale();
}
public void paly(){
System.out.println("我台式机抗摔打");
}
}
class RefinedAbstractionLaptop extends AbstractionComputer{
public RefinedAbstractionLaptop(ImplementorBrand brand) {
super(brand);
}
@Override
public void sale() {
//添加自己的特性,实际业务。
lighting();
super.sale();
}
public void lighting(){
System.out.println("我笔记本电脑充电5分钟,续航5小时");
}
}
class RefinedAbstractionPad extends AbstractionComputer{
public RefinedAbstractionPad(ImplementorBrand brand) {
super(brand);
}
@Override
public void sale() {
//添加自己的特性,实际业务。
weighting();
super.sale();
}
public void weighting(){
System.out.println("我平板电脑便于携带");
}
}
4、执行结果显示

四、问题回顾
4.1 什么是桥接模式、为什么要桥接?
简单说桥接模式就是把两个纬度分离,所以说当我们在实际开发的时候,遇到两个维度问题的时候,直接条件反射桥接模式。
就像上述问题,当有两个维度(品牌+机器类型)赋予给一个类的时候,基于单一职责原则,需要把它们解耦。那通过上述范例可知,那么我们就需要一座桥一样,把两个纬度用一个中间物(类或者接口)把它们关联起来,从而达到我们的目的。
4.2 桥接模式怎么接?
核心:如何把Implementor对象传递到抽象接口。
- 如上述描述,利用构造函数传参。
- 创造无参构造函数,添加get、set方法。
- 工厂模式:参考设计模式的工厂模式。
- IOC控制反转,最经典的就是Spring容器。内部的实现原理原本创建对象都是由我们自己管理,但是把这一步骤交给容器管理,就不用我们担心了。例如在JDBC的设计当中,充当这个角色的就是DriverManage去把对象注入在抽象接口当中。
4.3 桥接模式本质和经验
- 本质:抽象与实现(两个纬度)分离。
- 多用对象组合(has-A),少用继承。
- 开闭原则:我们应该对代码拓展开放,拒绝代码修改。
实际应用场景:

作者:码农皮邱
原文:https://www.cnblogs.com/qiuyong/p/6357839.html
推荐:您的支持是对博主深入思考总结的最大鼓励,要是有需要关注公众号与作者面对面对话交流~
说明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,尊重作者的劳动成果。

桥接模式:探索JDBC的接口的更多相关文章
- 设计模式:桥接模式及代码示例、桥接模式在jdbc中的体现、注意事项
0.背景 加入一个手机分为多种款式,不同款式分为不同品牌.这些详细分类下分别进行操作. 如果传统做法,需要将手机,分为不同的子类,再继续分,基本属于一个庞大的多叉树,然后每个叶子节点进行相同名称.但是 ...
- Java设计模式之《桥接模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6497919.html 这里摘抄一份他处的概念,你可以不必理会,先看下面得讲解与实例, ...
- 设计模式(7)--Bridge(桥接模式)--结构型
1.模式定义: 桥接模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥接模式的用意是“将抽象化(Abstraction)与实现化(Impleme ...
- [Unity 设计模式]桥接模式(BridgePattern)
1.前言 继上一讲IOC模式的基础上继续本讲桥接模式,笔者感觉桥接模式是23种设计模式中桥接模式是最好用但也是最难理解的设计模式之一,23中设计模式就好武侠剧中一本武功秘籍,我们在工作过程中想要熟练运 ...
- 桥接模式:探索JDBC底层实现
一.目录概要 二.问题探究 需求:假设要设计一个电脑商场管理系统的某个模块设计,电脑分为品牌和类型两个纬度,我们应该怎么解决? 按照初学者的思路,利用继承就能简单粗暴的实现,那我们来看下这种思路的设计 ...
- java面试题之----jdbc中使用的设计模式(桥接模式)
1.JDBC(JavaDatabase Connectivity) JDBC是以统一方式访问数据库的API. 它提供了独立于平台的数据库访问,也就是说,有了JDBC API,我们就不必为访问Oracl ...
- JDBC和桥接模式
本文参考 网上对于JDBC与桥接模式的理解各有不同,在这片文章里提出的是我个人对于二者的理解,本文参考的其它博文如下: https://blog.csdn.net/paincupid/article/ ...
- 桥接模式/bridge模式/对象结构型
意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 动机 当一个抽象类有多个实现时,通常用继承来协调它们.但是继承机制将抽象和实现固定,难以对抽象部分和实现部分独立地进行修改.扩充和重用. ...
- Java设计模式-桥接模式(Bridge)
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...
随机推荐
- Linux内核多线程实现方法 —— kthread_create函数【转】
转自:http://blog.csdn.net/sharecode/article/details/40076951 Linux内核多线程实现方法 —— kthread_create函数 内核经常需要 ...
- uboot makefile构建分析-续
前言 这篇博文是 uboot makefile构建分析的续篇,继续分析uboot构建u-boot.bin的过程 构建u-boot.bin过程分析 makefile一开始,就是确定链接脚本.在构建ubo ...
- Android快速入门(转自 农民伯伯: http://www.cnblogs.com/over140/)
前言 这是前段时间用于公司Android入门培训的资料,学习Android三周时间收集整理的,时间仓促,希望能对像我这样还没入门就直接上项目的人一点帮助 :) 声明 欢迎转载,但请保留文章原始出处: ...
- openjudge-NOI 2.6-1768 最大子矩阵
题目链接:http://noi.openjudge.cn/ch0206/1768/ 题解: 如果用O(n4)的算法肯定会炸,需要压缩掉一维的空间,只需要简单加和就好啦 例如,我们要对样例中第2-4行D ...
- Zabbix3.0源码安装
环境:nginx1.6.3 php-5.6.22 mysql-5.5.49 请参考前面的博文自行搭建 安装依赖并创建用户 [root@test88 ~]# yum install -y libxml2 ...
- BeanUtils简化数据封装
BeanUtils主要用来封装JavaBean的. 1.什么是JavaBean JavaBean指的是标准的类. 要求: 1. 类必须被public修饰2. 必须提供空参的构造器3. 成员变量必须使用 ...
- @PathVariable @RequestParam @RequestBody 的区别
转载自:@RequestParam @RequestBody @PathVariable 等参数绑定注解详解 简介: handler method 参数绑定常用的注解,我们根据他们处理的Request ...
- yii2 GirdView使用全教程
开始GridView GridView主要是为了实现表格复用,尤其我们做后台的时候,你发现表单和表格占据了大部分页面,而表格的样式又是高度的统一,那么如果有这样一个挂件,传入数据集自动渲染表格该多好. ...
- Linux内核编译安装
1. .config 复制一份当前系统编译时的配置,在/usr/src目录下 $ ls /usr/src/ linux-headers-4.10.0-35 linux-headers-4.8.0-36 ...
- BZOJ1878 [SDOI2009] HH的项链 [莫队,卡常]
BZOJ传送门,洛谷传送门 HH的项链 Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义. ...