注册

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

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


一、策略模式


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


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


代码示例: 让我们以一个游戏的例子来说明策略模式的使用。假设你正在开发一个角色扮演游戏,其中有两个角色:战士(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) // 没有任何输出

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


状态模式的优势:



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

缺点:



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

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



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

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


作者:潜行中的小角色
链接:https://juejin.cn/post/7243828459288395835
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册