十五 结构型-桥接模式(bridge)

170 阅读2分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

image.png 其他设计模式介绍
创建型: 工厂方法 抽象工厂 原型
结构型: 适配器 桥接模式 组合模式 装饰模式 外观模式 享元模式 代理模式
行为型: 职责链 命令 解释器 迭代器 中介者 备忘录 状态模式 策略模式 模板方法 访问者

定义

  • 在抽象和具体实现之间需要增加更多的灵活性的场景。
  • 一个类存在两个(或多个)独立变化的维度,而这两个维度都需要独立进行扩展。
  • 不希望使用继承,或因为多层继承导致系统类的数量增加。

UML

image.png

示例

interface Color {
    fun painting(shape: String)
}
abstract class Shape {
    internal var color: Color? = null
    fun setColor(color: Color?) {
        this.color = color
    }

    abstract fun draw()
}

class Circle : Shape() {
    override fun draw() {
        color!!.painting("圆形")
    }
}

class Rectangle : Shape() {
    override fun draw() {
        color!!.painting("长方形")
    }
}


class White : Color {
    override fun painting(shape: String) {
        println("白色的$shape")
    }
}

class Black : Color {
    override fun painting(shape: String) {
        println("黑色的$shape")
    }
}

fun main() {
    // 白色
    val white: Color = White()
    // 圆形
    val circle: Shape = Circle()
    // 设置颜色
    circle.setColor(white)
    circle.draw()

    //长方形
    val rectangle: Shape = Rectangle()
    rectangle.setColor(white)
    rectangle.draw()
}

运行结果:
白色的圆形
白色的长方形

优点

  1. 分离抽象接口及其实现部分。提高了比继承更好的解决方案。

  2. 桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。

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

缺点

  1. 桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
  2. 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。

使用场景

  1. 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

  2. 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

  3. 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

模式总结

  1. 桥接模式实现了抽象化与实现化的脱耦。他们两个互相独立,不会影响到对方。

  2. 对于两个独立变化的维度,使用桥接模式再适合不过了。

  3. 对于“具体的抽象类”所做的改变,是不会影响到客户。