目录
开始
为什么引入桥接模式
桥接模式概述
桥接模式实现
桥接模式的扩展性
开始
为什么引入桥接模式
问题:针对 不同品牌 的 不同类型手机 实现 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)运行结果