一. 定义与类型

定义:将抽象部分与他的具体实现部分分离,使它们都可以独立的变化,通过组合的方式建立两个类之间的联系,而不是继承

类型:结构性。

二. 使用场景

(1) 抽象和具体实现之间增加更多的灵活性

(2) 一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立进行扩展

(3) 不希望使用继承,或因为多层继承导致系统类的个数剧增

三. 优缺点

优点:

  (1) 分离抽象部分及其具体实现部分,解耦抽象与实现的绑定关系

  (2) 提高了系统的可扩展性

  (3) 符合开闭原则

  (4) 符合合成复用原则

缺点:

  (1) 增加了系统的理解与设计难度

  (2) 需要正确的识别出系统中两个独立变化的维度

四. 相关设计模式

桥接模式和组合模式:

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

桥接模式和适配器模式:

  它们的共同点都是为了让两个东西配合工作,但是它们的目的不一样。适配器模式是改变已有的接口,让它们之间可以相互配合,可以把功能上相似,但是接口不同的类适配起来;桥接模式是分离抽象和具体的实现,它的目的就是分离,在此基础上使这些层次结构结合起来。

五. Coding

桥接模式是将抽象与实现分离,例如银行与账号。银行有中国农业银行(ABC)和中国工商银行(ICBC)等,账号有活期账号,定期账号。

如果把它们都联系在一起,有很多的银行再加上大量的账号类型,会导致类的剧增,类爆炸。所以采用桥接模式将银行与账号的抽象类与具体的实现进行分离,降低了耦合性并提高了扩展性。

创建账号接口Account:

/**
* @program: designModel
* @description: 账号接口
* @author: YuKai Fan
* @create: 2019-02-12 15:15
**/
public interface Account {
Account openAccount();
void showAccountType();
}

在创建两个具体的账号类实现接口:

/**
* @program: designModel
* @description: 活期账号
* @author: YuKai Fan
* @create: 2019-02-12 15:17
**/
public class SavingAccount implements Account {
public Account openAccount() {
System.out.println("打开活期账号");
return new SavingAccount();
} public void showAccountType() {
System.out.println("这是一个活期账号");
}
}
/**
* @program: designModel
* @description: 定期账号
* @author: YuKai Fan
* @create: 2019-02-12 15:17
**/
public class DepositAccount implements Account {
public Account openAccount() {
System.out.println("打开定期账号");
return new DepositAccount();
} public void showAccountType() {
System.out.println("这是一个定期账号");
}
}

在创建银行抽象类:在类中声明openAccount()与接口中的方法名可以不一样,只是更好的理解,因为Bank中的openAccount()是需要委托给Account接口中的openAccount()方法。因为桥接模式是抽象与实现的分离,那实现就是Account的两个实现类,所以将Bank中的openAccount委托给Account接口,从而实现抽象与实现分离

/**
* @program: designModel
* @description: 银行抽象类
* @author: YuKai Fan
* @create: 2019-02-12 15:19
**/
public abstract class Bank {
protected Account account;
public Bank(Account account) {
this.account = account;
}
abstract Account openAccount();
}

在创建两个具体的银行:这两个类中实现的openAccount中其实调用的是Account中两个实现类中的openAccount方法,从而实现了委托。要把具体的行为委托给抽象父类注入的account,这样Account中的openAccount如何扩展都不需要去改变,Bank中的openAccount

/**
* @program: designModel
* @description:
* @author: YuKai Fan
* @create: 2019-02-12 15:23
**/
public class ABCBank extends Bank {
public ABCBank(Account account) {
super(account);
} Account openAccount() {
System.out.println("打开中国农业银行账号");
account.openAccount();
return account;
}
}
/**
* @program: designModel
* @description:
* @author: YuKai Fan
* @create: 2019-02-12 15:24
**/
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
} Account openAccount() {
System.out.println("打开工商银行账号");
account.openAccount();
return account;
}
}

结果:

UML类图:

可以看出,如果现在再添加一个账号,只需要,在实现Account接口在创建一个账号类即可。将银行与账号进行组合,而在每个单独的对象中又进行桥接,从而无限的排列组合。

六. 源码分析

(1) jdk中JDBC对Driver封装

java设计模式——桥接模式的更多相关文章

  1. 【设计模式】Java设计模式 - 桥接模式

    [设计模式]Java设计模式 - 桥接模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起 ...

  2. JAVA 设计模式 桥接模式

    用途 桥接模式 (Bridge) 将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构

  3. Java设计模式-桥接模式(Bridge)

    桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化.桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时 ...

  4. java设计模式---桥接模式

    桥接模式的目的是把抽象和具体实现分离,其uml类图如下所示: public interface SendMessage { abstract void send(String message,Stri ...

  5. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  6. 转:设计模式-----桥接模式(Bridge Pattern)

    转自:http://www.cnblogs.com/houleixx/archive/2008/02/23/1078877.html 记得看原始链接的评论. 学习设计模式也有一段时间了,今天就把我整理 ...

  7. 跟着ZHONGHuan学习设计模式--桥接模式

    转载请注明出处! ! !http://blog.csdn.net/zhonghuan1992 全部配套代码均在github上:https://github.com/ZHONGHuanGit/Desig ...

  8. linkin大话设计模式--桥接模式

    linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...

  9. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

随机推荐

  1. team foundation server 工具的使用

    1.打开TFS工具点击创建集合,填写集合名称,下一步,按照步骤一步一步的往下操作. 2.创建完集合以后,打开VS工具,如下图,在主页上左键选择新建团队项目. 3.选择团队项目,然后选择新建的项目集合和 ...

  2. springboot 启动的java进程默默终止

    首先说明这是一个灵异事件......... 场景1 :把之前用map实现的缓存用Redis重构,高高兴兴上线更新,10 分钟后,老板告诉我,项目停了,what ??? 像我这么帅气,英俊,聪明的人,更 ...

  3. chrome 修改请求头的小工具

    chrome 网上应用店中搜索  ModHeader

  4. 性能测试工具LoadRunner17-LR之Controller windows系统资源性能常用计数器

    1.System %Total Processor Time 该计数值用于体现服务器整体的处理器利用率,对多处理器而言,该计数值体现的是所有CPU的平均利用率.如果该值的数值持续超过90%,则可以说明 ...

  5. w3schools juerymobile

    http://www.w3schools.com/jquerymobile/jquerymobile_examples.asp <!DOCTYPE html> <html> & ...

  6. [转]Javascript的匿名函数

    本文转自:http://dancewithnet.com/2008/05/07/javascript-anonymous-function/ 一.什么是匿名函数? 在Javascript定义一个函数一 ...

  7. Hbase与传统数据库的区别

    在说HBase之前,我想再唠叨几句.做互联网应用的哥们儿应该都清楚,互联网应用这东西,你没办法预测你的系统什么时候会被多少人访问,你面临的用户到底有多少,说不定今天你的用户还少,明天系统用户就变多了, ...

  8. 通过一个例子,总结下检测数组属性的N种方法

    判断arr数组里是否含有a,有a返回1;没有返回2var arr = [{a:1,b:2,c:3},{q:1,w:2,e:3},{s:4,g:5,i:9},{b:2,v:3,u:4}]; 检测属性的3 ...

  9. JNA简单使用

    近期使用Java开发有关于摄像机接收到数据的上传,因为摄像机处理图像是用C语言实现的,所以开发需要用到JNA,实现JAVA对C语言的回调,因为具体的开发方式官方文档里面有示例,所以本文只是简单的把需要 ...

  10. MySQL(三) 完整性约束

    一.介绍 约束条件与数据类型的宽度意义,都是可选参数. 作用:用于保证数据的完整性和一致性. 主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN ...