美文网首页
Android-策略模式与状态模式:形似而行不似

Android-策略模式与状态模式:形似而行不似

作者: BlueSocks | 来源:发表于2023-06-20 15:08 被阅读0次

引言

在软件开发中,我们经常面临着需求的变化和复杂的业务逻辑。为了解决这些问题,设计模式应运而生。其中,策略模式和状态模式是两种常用的设计模式。本文将带你走进它们的世界,一起探索它们的魅力和应用场景。

一、策略模式

在生活中,我们经常会遇到需要根据不同情况采取不同策略的情况。软件开发也存在类似的情况。策略模式就是为了解决这类问题而生的。它允许在运行时根据需要选择算法的行为。

应用场景: 想象一下,你是一位游戏开发者,你的游戏中有多种角色,每个角色都有不同的攻击方式。使用策略模式,你可以为每个角色创建一个独立的攻击策略,然后在运行时根据角色的选择来决定使用哪种策略。这样,你就能灵活地扩展和切换角色的攻击方式,而无需修改大量的代码。

代码示例: 让我们以一个游戏的例子来说明策略模式的使用。假设你正在开发一个角色扮演游戏,其中有两个角色:战士(Warrior)和法师(Mage)。每个角色都有自己的攻击方式。首先,我们需要定义一个策略接口,表示不同的攻击策略:

interface AttackStrategy {
    fun attack()
}

接下来,我们创建两个具体的策略类,分别代表战士和法师的攻击方式:

class WarriorAttackStrategy : AttackStrategy {
    override fun attack() {
        println("战士使用剑攻击")
    }
}

class MageAttackStrategy : AttackStrategy {
    override fun attack() {
        println("法师使用魔法攻击")
    }
}

最后,我们创建一个角色类,其中包含一个攻击策略的引用:

class Character(private val attackStrategy: AttackStrategy) {
    fun attack() {
        attackStrategy.attack()
    }
}

现在,我们可以创建战士和法师的实例,并分别调用它们的攻击方法:

val warrior = Character(WarriorAttackStrategy())
warrior.attack() // 输出:战士使用剑攻击

val mage = Character(MageAttackStrategy())
mage.attack() // 输出:法师使用魔法攻击

通过使用策略模式,我们可以轻松地为角色添加新的攻击方式,而无需修改角色类的代码。

策略模式的优势:

  • 灵活性:策略模式允许在运行时动态切换算法,使系统更具灵活性。
  • 可扩展性:通过添加新的策略类,我们可以轻松地扩展系统的功能。

缺点:

  • 增加了类的数量:引入策略模式会增加类的数量,特别是当策略类较多时。过度使用策略模式可能会导致类爆炸。

二、状态模式

在某些情况下,对象的行为取决于其内部状态的变化。状态模式可以帮助我们更好地管理对象的状态,并基于不同的状态执行相应的行为。

应用场景: 以电梯为例,电梯在不同的状态下有不同的行为。比如,当电梯在运行状态下,按下楼层按钮不会有任何反应;而当电梯在停止状态下,按下楼层按钮会触发电梯移动到相应楼层的行为。使用状态模式,我们可以更好地管理电梯的状态和行为,提高系统的可维护性和扩展性。

代码示例: 让我们以电梯的例子来说明状态模式的使用。首先,我们定义一个电梯状态接口:

interface ElevatorState {
    fun pressFloorButton(floor: Int)
}

接下来,我们创建两个具体的状态类,分别代表电梯的运行状态和停止状态:

class RunningState : ElevatorState {
    override fun pressFloorButton(floor: Int) {
        // 运行状态下不响应按钮按下事件
    }
}

class StoppedState : ElevatorState {
    override fun pressFloorButton(floor: Int) {
        println("电梯移动到楼层 $floor")
    }
}

然后,我们创建一个电梯类,其中包含一个状态的引用:

class Elevator(private var state: ElevatorState) {
    fun setState(state: ElevatorState) {
        this.state = state
    }

    fun pressFloorButton(floor: Int) {
        state.pressFloorButton(floor)
    }
}

现在,我们可以创建一个电梯的实例,并模拟按下楼层按钮的事件:

val elevator = Elevator(StoppedState())
elevator.pressFloorButton(5) // 输出:电梯移动到楼层 5

elevator.setState(RunningState())
elevator.pressFloorButton(7) // 没有任何输出

通过使用状态模式,我们可以根据电梯的状态来决定是否响应按钮按下事件,并执行相应的行为。

状态模式的优势:

  • 易于扩展:通过添加新的状态类,我们可以轻松地扩展系统的行为。
  • 可维护性:状态模式使状态转换和行为与特定状态相关,使代码更具可读性和可维护性。

缺点:

  • 增加了类的数量:引入状态模式会增加类的数量,特别是当状态较多时。过度使用状态模式可能会导致类爆炸。

策略模式与状态模式的区别:

  • 目的不同:策略模式关注的是算法的选择和使用,用于根据不同的策略执行不同的行为;而状态模式关注的是对象内部状态的变化,用于根据不同的状态执行不同的行为。
  • 职责不同:策略模式将不同的算法封装成独立的策略类,客户端主动选择使用哪种策略;而状态模式将不同的状态封装成独立的状态类,并由环境类根据当前状态执行相应的行为。
  • 关注点不同:策略模式关注的是行为的选择和灵活性,用于动态地切换算法;而状态模式关注的是状态的变化和可维护性,用于根据状态执行相应的行为。

结语: 策略模式和状态模式是两种常用的设计模式,它们分别解决了根据不同策略和状态执行不同行为的问题。通过灵活地选择和管理策略或状态,我们可以提高系统的灵活性、可扩展性和可维护性。在实际开发中,我们可以根据具体的需求和场景选择适合的设计模式,以优化代码结构和提高系统的可维护性。希望本文能帮助你更好地理解和应用策略模式和状态模式,让你在设计中游刃有余,解决你的设计困扰!

相关文章

  • 设计模式-行为模式-策略模式

    策略模式与状态模式看起来差不多,只是从概念上侧重不同。策略模式封装的是策略或算法,状态模式封装的是状态,主要区别在...

  • 策略模式和状态模式

    不怕跌倒,所以飞翔 本文中知识点概述: 策略模式和状态模式的基本概念 策略模式和状态模式的区别 策略模式和状态模式...

  • 策略模式与状态模式

    状态模式 状态模式将状态的切换交由具体的处理节点做判断, 容器只提供执行上下文 类模式实现 策略模式 调用具体执行...

  • 设计模式整理(7) 状态模式

    学习《Android 源码设计模式解析与实践》系列笔记 介绍 状态模式和策略模式都是行为型模式。状态模式中的行为是...

  • Java设计模式 - 状态模式

    定义 状态模式,即因状态而定,因状态而产生具体行为。状态模式与策略模式极其相似,但是二者却有着天壤之别。状态模式的...

  • 状态模式

    什么是状态模式 通过不同的状态,动态调用不同的对象,完成不同的行为(状态模式与策略模式挺相似,但是状态模式是没有共...

  • 现实中的模式应用

    桥接模式 针对接口编程,就是桥接模式 策略模式 策略模式也可看作是针对接口编程 状态模式 状态模式通过 Conte...

  • 设计模式-状态模式

    介绍 状态模式和策略模式是一对双胞胎,他们都属于行为设计模式。状态模式和策略模式都是为具有多种可能情形设计的模式,...

  • Android设计模式—策略模式与状态模式

    策略模式和状态模式都比较简单好理解,都是为了解决一个问题有多种方案这样的场景,两者结构几乎一样。 不同的是状态模式...

  • 设计模式之——状态模式与策略模式

    如果你的简历里出现了"设计模式"的字样,那么作为面试官的我几乎都会问到一个问题: "状态模式与策略模式有哪些区别"...

网友评论

      本文标题:Android-策略模式与状态模式:形似而行不似

      本文链接:https://www.haomeiwen.com/subject/wlwyydtx.html