一、状态模式

状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类(行为型)。

状态模式角色:

  • 环境类:拥有多种状态的对象,维护一个抽象状态类State的实例,这个实例定义当前的状态;
  • 抽象状态类:声明了各种不同状态对应的方法,并在子类中实现;
  • 具体状态类:实现与环境类的一个状态相关的行为。

二、实现

在src目录下,新建一个state文件夹,在该文件夹下新建一个state.cj文件和state.drawio文件。

类图

核心代码

package DesignPattern.state

// 抽象状态类
public abstract class ScreenState {
    public var state = ""
    public func display(): Unit
}

// 具体状态类
class NormalState <: ScreenState {
    public init() {
        this.state = "正常"
    } 

    public override func display() {
        println("${this.state}大小!")
    }
}

class LargerState <: ScreenState {
    public init() {
        this.state = "二倍"
    } 
    
    public override func display() {
        println("${this.state}大小!")
    }
}

class LargestState <: ScreenState {
    public init() {
        this.state = "四倍"
    } 
    
    public override func display() {
        println("${this.state}大小!")
    }
}

// 环境类
public class Screen {
    private var currentState: ScreenState
    private var normalStste: ScreenState
    private var largerState: ScreenState
    private var largestState: ScreenState

    public init() {
        this.normalStste = NormalState()
        this.largerState = LargerState()
        this.largestState = LargestState()
        this.currentState = this.normalStste
        this.normalStste.display()
    }

    func setState(stage: ScreenState) {
        this.currentState = stage
    }

    public func onClick() {
        if (this.currentState.state == this.normalStste.state) {
            this.setState(this.largerState)
            this.currentState.display()
        } else if (this.currentState.state == this.largerState.state) {
            this.setState(this.largestState)
            this.currentState.display()
        } else if (this.currentState.state == this.largestState.state) {
            this.setState(this.normalStste)
            this.currentState.display()
        }
    }
}

测试代码

package DesignPattern
import DesignPattern.state.*

main(): Int64 {
    let screen = Screen()
    screen.onClick()
    screen.onClick()
    screen.onClick()
    
    return 0
}

三、优缺点

优点:

  • 状态模式封装了状态的转换规则,将状态转换代码封装到环境类或者具体状态类里,便于集中管理;
  • 状态模式将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象,即可使环境对象拥有不同的行为。

缺点:

  • 状态模式会增加系统类和对象的个数,导致系统运行开销过大;
  • 状态模式的结构与实现都较为复杂,使用不当会造成系统设计的难度;
  • 状态模式在新增状态的时候需要修改负责转换状态的源码,不符合开闭原则。

四、适用环境

  • 对象的行为依赖它的状态,状态的改变将导致行为的变化时;
  • 在代码中包含大量与对象状态相关的条件语句时,可以使用状态模式进行解耦。

五、小结

本章为大家详细的介绍了仓颉设计模式中状态模式的内容,下一章,为大家带来状态模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐