• 设计模式之美


    设计模式之美 - 桥接模式

    设计模式之美目录: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 驱动就非常容易。

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

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

    桥接模式的缺点

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

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


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

  • 相关阅读:
    CodeForces1214B
    CodeForces1214A
    LuoGuP4551最长异或路径
    GXOI2018 滚粗记
    [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)
    [LuoguP3808] 【模板】AC自动机(简单版)数组版
    [NOIP 2016D2T2/Luogu P1600] 天天爱跑步 (LCA+差分)
    [CF160D]Edges in MST (最小生成树+LCA+差分)
    [Luogu P2891/POJ 3281/USACO07OPEN ]吃饭Dining
    [BZOJ 2287/POJ openjudge1009/Luogu P4141] 消失之物
  • 原文地址:https://www.cnblogs.com/binarylei/p/9006205.html
Copyright © 2020-2023  润新知