跟我一起学“仓颉”设计模式-状态模式
本章为大家详细的介绍了仓颉设计模式中状态模式的内容。
·
一、状态模式
状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类(行为型)。
状态模式角色:
- 环境类:拥有多种状态的对象,维护一个抽象状态类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
}
三、优缺点
优点:
- 状态模式封装了状态的转换规则,将状态转换代码封装到环境类或者具体状态类里,便于集中管理;
- 状态模式将所有与某个状态有关的行为放到一个类中,只需要注入一个不同的状态对象,即可使环境对象拥有不同的行为。
缺点:
- 状态模式会增加系统类和对象的个数,导致系统运行开销过大;
- 状态模式的结构与实现都较为复杂,使用不当会造成系统设计的难度;
- 状态模式在新增状态的时候需要修改负责转换状态的源码,不符合开闭原则。
四、适用环境
- 对象的行为依赖它的状态,状态的改变将导致行为的变化时;
- 在代码中包含大量与对象状态相关的条件语句时,可以使用状态模式进行解耦。
五、小结
本章为大家详细的介绍了仓颉设计模式中状态模式的内容,下一章,为大家带来状态模式练习题的内容。最后,创作不易,如果大家觉得我的文章对学习仓颉设计模式有帮助的话,就动动小手,点个免费的赞吧!收到的赞越多,我的创作动力也会越大哦,谢谢大家🌹🌹🌹!!!
更多推荐



所有评论(0)