19_桥接模式

一、桥接相关类

package com.study.bridge

/**
 * 身份
 */
abstract class Identity {
    /**
     * 获取当前身份类型
     */
    abstract fun getIdentity(): String
}
package com.study.bridge

class BossIdentity : Identity() {
    override fun getIdentity(): String = "老板"
}
package com.study.bridge

class StudentIdentity : Identity() {
    override fun getIdentity(): String = "学生"
}
package com.study.bridge

/**
 * 抽象的手机
 */
abstract class Phone(var identity: Identity) {
    abstract fun usePhone()
}
package com.study.bridge

/**
 * 功能类型的手机
 */
class FunctionPhone(identity: Identity) : Phone(identity) {
    override fun usePhone() {
        println("${identity.getIdentity()}相机类型手机")
    }

}
package com.study.bridge

/**
 * 拍照类型的手机
 */
class CameraPhone(identity: Identity) : Phone(identity) {
    override fun usePhone() {
        println("${identity.getIdentity()}功能类型手机")
    }

}

二、主程序调用

package com.study.bridge

/**
 * 相同的手机对应不同的用户群体/相同用户群体使用不同的手机
 *
 * 例如:学生和老板两个群体,对手机都有着不同的需求。
 * 如果以功能和身份结合起来命名手机,那么Phone就会产生(m个身份*n个功能)的子类。
 * 这样很可能导致类爆炸,此时引入桥接模式则可以解决这个问题
 *
 * StudentCameraPhone、StudentFunctionPhone
 * BossCameraPhone、BossFunctionPhone
 *
 *  定义和类型
    将抽象部分和它的具体实现部分分离,使他们都可以独立的变化
    通过组合的方式建立两个类之间联系,而不是继承

    类型:结构型

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

    优点
    分离抽象部分及其具体实现部分
    提高了系统的可扩展性
    符合开闭原则
    符合合成复用原则

    缺点
    增加了系统的理解和设计难度
    需要正确的识别出系统中两个独立变化的维度
 *
 */
fun main() {
    val studentIdentity = StudentIdentity()
    val bossIdentity = BossIdentity()

    val studentCameraPhone = CameraPhone(studentIdentity)
    studentCameraPhone.usePhone()
    val bossCameraPhone = CameraPhone(bossIdentity)
    bossCameraPhone.usePhone()

    val studentFunctionPhone = FunctionPhone(studentIdentity)
    studentFunctionPhone.usePhone()
    val bossFunctionPhone = FunctionPhone(bossIdentity)
    bossFunctionPhone.usePhone()
}

三、运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值