设计模式 - 桥接模式,就要这样学!

目录

开始

为什么引入桥接模式

桥接模式概述

桥接模式实现

桥接模式的扩展性


开始


为什么引入桥接模式

问题:针对 不同品牌 的 不同类型手机 实现 open、close、call 操作.

如果将来新增一个手机类型,例如 IPhone,就需要继续写对应的三个类(mini、pro、promax)...

如果将来新增一个手机参数,例如 promaxmax,就需要给每个手机类型都添加这个 参数类型...

为了解决这个问题,就引入了桥接模式~

桥接模式概述

桥接模式:是一种结构性设计模式,将抽象(Abstraction)和实现(Implementation)放在两个不同的类层次中,使两个层次可以独立改变.

主要角色如下:

  • 抽象:
    • 抽象类:就是真个桥接的桥梁,里面聚合了行为的 实现接口 .
    • 精确抽象:是具体的逻辑实体,通过父类中提供的聚合行为接口来完成不同的交互.
  • 行为:
    • 实现接口:这里就定义了实体的行为.  此接口被抽象类聚合.
    • 具体实现:实现了具体的实体行为.

桥接模式实现

以上述手机为例

a)实现接口,这里就定义了手机的行为

interface Phone {
    fun open()
    fun call()
    fun close()
}

b)具体实现,这里就是对手机的行为具体实现

class XiaoMi: Phone {
    override fun open() = println("xiaomi open")
    override fun call() = println("xiaomi call")
    override fun close() = println("xiaomi close")
}

class HuaWei: Phone {
    override fun open() = println("huawei open")
    override fun call() = println("huawei call")
    override fun close() = println("huawei close")
}

c)抽象类,这里就聚合了手机的具体行为.

abstract class Model (
    protected val phone: Phone //聚合手机
)

d)精确抽象,就是手机的不同参数类型实体,通过调用父类聚合的手机行为完成动作.

class PhonePro (
    phone: Phone
): Model(phone) {
    fun open() {
        super.phone.open()
        println("pro")
    }
    fun close() {
        super.phone.close()
        println("pro")
    }
    fun call() {
        super.phone.call()
        println("pro")
    }
}

class PhoneMini (
    phone: Phone
): Model(phone) {
    fun open() {
        super.phone.open()
        println("mini")
    }
    fun close() {
        super.phone.close()
        println("mini")
    }
    fun call() {
        super.phone.call()
        println("mini")
    }
}

e)客户端

fun main() {
    val huaWeiPro = PhonePro(HuaWei())
    huaWeiPro.call()
    println("-------------------------------")
    val xiaoMiPro = PhonePro(XiaoMi())
    xiaoMiPro.call()
}

运行如下:

 

桥接模式的扩展性

根据上述代码,将来如果要新增一种手机类型,例如 IPhone,那么只需要添加这样一个具体的行为实现类即可.

a)只需要一个 IPhone 的实现类即可,无需再给 IPhone 添加pro、mini、promax参数,因为行为和抽象已经是分离的.

class IPhone: Phone {
    override fun open() = println("iphone open")
    override fun call() = println("iphone call")
    override fun close() = println("iphone close")
}

b)客户端直接调用即可

fun main() {
    val huaWeiPro = PhonePro(HuaWei())
    huaWeiPro.call()
    println("-------------------------------")
    val xiaoMiPro = PhonePro(XiaoMi())
    xiaoMiPro.call()
    println("-------------------------------")
    val iphonePro = PhonePro(IPhone())
    iphonePro.call()
}

c)运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值