zoukankan      html  css  js  c++  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 驱动就非常容易。

    • 可动态的切换实现:由于桥接模式实现了抽象和实现的分离,所以可以实现动态切换。

    • 实现细节对客户端透明,可以对用户隐藏实现细节。

    桥接模式的缺点

    • 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。

    • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性。


    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    html HTML 文本格式化
    纯css3实现图片切换
    绝对路径和相对路径
    CSS设置html网页背景图片 CSS设置网页背景颜色
    使用CSS3制作响应式网页背景图像
    CSS背景全攻略
    HTML中通过CSS设置背景图片自适应浏览器大小
    CSS设置背景——图片背景
    如何让图片自适应手机等移动设备屏幕大小
    SERVER 2012 R2 对域用户禁用移动存储设备
  • 原文地址:https://www.cnblogs.com/binarylei/p/9006205.html
Copyright © 2011-2022 走看看