安卓常见设计模式5------桥接模式(Kotlin版)

1. W1 是什么,什么是桥接模式?

  1. 桥接模式是一种结构性模式。

  2. 桥接模式旨在将抽象与实现解耦 ,使它们可以独立地变化。可以这么理解,面向对象编程是单继承多实现的,如果我们有一个可扩展类,和多个相关的可扩展维度的话,就可以创建一个抽象类来像桥梁一样连接这些个维度。

    因此这里的抽象 可以理解为有一个抽象类,实现就代表多个接口。而桥接模式就是在这个抽象类里放多个接口,结构不就清晰明了了哇。

2. W2 为什么,为什么需要使用桥接模式,能给我们编码带来什么好处?

  1. 解耦抽象与实现:桥接模式有助于将抽象部分与实现部分分离。通过将两者之间的连接通过桥接对象进行,可以使它们可以独立地变化。这种解耦使得系统更加灵活,更容易扩展和维护。

  2. 提高可扩展性:通过桥接模式,我们可以轻松添加新的抽象部分和实现部分,而不需要修改现有的代码。例如,在下面的怪物例子中,我们可以添加新的攻击方式或属性类,而不会影响现有的攻击方式和属性的组合。这种可扩展性使得系统更具弹性,能够适应变化的需求。

  3. 支持组合复用:桥接模式使得可以通过组合不同的抽象部分和实现部分来创建不同的组合对象。这种组合复用的方式使得系统更加灵活,可以根据需要构建不同的对象组合。

  4. 提高可维护性和可读性:通过将抽象和实现分离,桥接模式使得代码结构更清晰,易于理解和维护。每个部分都有自己的责任,而且它们之间的关系也更加明确。这种清晰性和可读性有助于减少错误和改进代码的可维护性。

3. W3,如何使用?下面是代码示例:

  1. 假设我们正在开发一个游戏,其中有不同类型的怪物(Monster)。每个怪物都有不同的攻击方式(AttackMode),比如近战攻击和远程攻击。同时,怪物还有不同的属性(Attribute),比如光属性和雷属性。

  2. 分析发现,这里的怪物可扩展,有不同类型,怪物的攻击方式也可扩展,有近战和远程,同时怪物还有不同的属性,也可扩展,那么这里就有3个可扩展的维度,我们选择其中的一个维度作为抽象类,其他的作为接口,用这个抽象类连接其他接口,这就是桥接模式了。

  3. 那选谁作为这个抽象类呢,选主体Monster是比较符合我们编程风格的。

代码示例:

kotlin 复制代码
// 首先,我们定义一个抽象类 Monster,它包含了怪物的基本属性和抽象方法
abstract class Monster {
	// 攻击方式
    protected lateinit var attackMode: AttackMode
    // 基本属性
	protected lateinit var attribute: Attribute

    fun setAttackMode(attackMode: AttackMode) {
        this.attackMode = attackMode
    }
    
	fun setAttribute(attribute: Attribute) {
        this.attribute = attribute
    }
	
    abstract fun display()
    abstract fun attack()
    abstract fun defend()
}

// 然后,我们定义接口 AttackMode, Attribute,其中包含了怪物攻击的方法以及怪物的属性:
interface AttackMode {
    fun attack()
}


interface Attribute{
    fun display()
}

// 接下来,我们创建不同类型的怪物,每个怪物都可以设置不同的攻击方式和展示不同的属性:
class MeleeMonster : Monster() {
    override fun display() {
        attribute.display()
    }

    override fun attack() {
        attackMode.attack()
    }

    override fun defend() {
        println("Defending as a melee monster")
    }
}

class RangedMonster : Monster() {
    override fun display() {
        attribute.display()
    }

    override fun attack() {
        attackMode.attack()
    }

    override fun defend() {
        println("Defending as a ranged monster")
    }
}

// 最后,我们实现具体的攻击方式,比如近战攻击和远程攻击,还要实现具体的属性,比如光属性,雷属性:

class MeleeAttack : AttackMode {
    override fun attack() {
        println("Performing melee attack")
    }
}

class RangedAttack : AttackMode {
    override fun attack() {
        println("Performing ranged attack")
    }
}

class LightAttribute: Attribute {
    override fun display() {
        println("Show body protection light")
    }
}

class ThunderAttribute: Attribute{
    override fun display() {
        println("Show body protection thunder")
    }
}

// 现在,我们可以在应用程序中使用这些类来创建怪物,并设置它们的攻击方式和属性:
fun main() {
    val meleeMonster = MeleeMonster()
    meleeMonster.setAttackMode(MeleeAttack())
   	meleeMonster.setAttribute(LightAttribute())
    meleeMonster.display()
    meleeMonster.attack()
    meleeMonster.defend()

    val rangedMonster = RangedMonster()
    rangedMonster.setAttackMode(RangedAttack())
	rangedMonster.setAttribute(ThunderAttribute())
    rangedMonster.display()
    rangedMonster.attack()
    rangedMonster.defend()
}

Thank you for your reading, best regards!

相关推荐
crmscs22 分钟前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob24 分钟前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔29 分钟前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei99629 分钟前
flutter和Android动画的对比
android·flutter·动画
lxysbly2 小时前
md模拟器安卓版带金手指2026
android
儿歌八万首3 小时前
硬核春节:用 Compose 打造“赛博鞭炮”
android·kotlin·compose·春节
消失的旧时光-19436 小时前
从 Kotlin 到 Dart:为什么 sealed 是处理「多种返回结果」的最佳方式?
android·开发语言·flutter·架构·kotlin·sealed
Jinkxs6 小时前
Gradle - 与Groovy/Kotlin DSL对比 构建脚本语言选择指南
android·开发语言·kotlin
&有梦想的咸鱼&6 小时前
Kotlin委托机制的底层实现深度解析(74)
android·开发语言·kotlin
LDORntKQH6 小时前
基于深度强化学习的混合动力汽车能量管理策略 1.利用DQN算法控制电池和发动机发电机组的功率分配 2
android