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 驱动就非常容易。

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

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

    桥接模式的缺点

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

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


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

  • 相关阅读:
    Elementary Methods in Number Theory Exercise 1.2.25
    Elementary Methods in Number Theory Exercise 1.2.14
    图解欧几里德算法
    图解欧几里德算法
    Elementary Methods in Number Theory Exercise 1.2.14
    Android中的长度单位详解(dp、sp、px、in、pt、mm)
    分享下多年积累的对JAVA程序员成长之路的总结
    android异常之都是deamon惹的祸The connection to adb is down, and a severe error has occured.
    TomatoCartv1.1.8.2部署时报错
    JavaScript浏览器对象之二Document对象
  • 原文地址:https://www.cnblogs.com/binarylei/p/9006205.html
Copyright © 2011-2022 走看看