Design patterns 状态机和状态模式的实现之间有什么区别?
我想知道状态机是否只是工作中的状态模式,或者这两者之间是否真的有区别Design patterns 状态机和状态模式的实现之间有什么区别?,design-patterns,architecture,state-machine,state-pattern,Design Patterns,Architecture,State Machine,State Pattern,我想知道状态机是否只是工作中的状态模式,或者这两者之间是否真的有区别 我发现了这一点,但在一天结束时,他只说状态模式使状态机过时,但没有描述与状态模式的实现相比,状态机到底是什么。状态机可以用几种方式设计和实现。一种方法是使用四人帮在书中描述的状态模式。但是还有其他模式可以实现状态机 例如,您可能想通过阅读《C/C++中的实用UML状态图》(第二版)(嵌入式系统的事件驱动编程)一书来了解Miro Samek的研究 您可能也会发现有趣的地方。我向同事们描述这种差异的方式是,状态模式是许多独立封装状
我发现了这一点,但在一天结束时,他只说状态模式使状态机过时,但没有描述与状态模式的实现相比,状态机到底是什么。状态机可以用几种方式设计和实现。一种方法是使用四人帮在书中描述的状态模式。但是还有其他模式可以实现状态机 例如,您可能想通过阅读《C/C++中的实用UML状态图》(第二版)(嵌入式系统的事件驱动编程)一书来了解Miro Samek的研究
您可能也会发现有趣的地方。我向同事们描述这种差异的方式是,状态模式是许多独立封装状态的一种更分散的实现,而状态机则更单一。状态机的整体性意味着单个状态将更难在不同的机器中重用,并且更难将状态机分解为多个编译单元。另一方面,这种单片设计允许更好地优化状态机,并允许许多实现在表中的一个位置表示所有转换信息。这尤其适用于负责状态机架构或功能的人员不熟悉其实现的编程语言的情况。请记住,许多工程和数学专业的学生都学习过状态机,但在编程领域几乎没有受过教育。向这些类型的人展示一个包含转换、操作和保护的表格要比一页页一页的状态模式容易得多 尽管这篇文章实际上读得不错,但我在以下几点上与作者意见相左:
- “当您使用面向对象的编程语言时,没有理由再使用状态机了。”如果您对执行速度有任何要求,这绝对不是事实李>
- 作者的实现特别短或简单,或者比boost statecharts数码相机需要更少的维护,这取决于您的用例和个人喜好,但不能分类李>
状态机抽象状态图本身,并将其与转换有效负载解耦。要更改特定状态,必须修复整个关系图。但是要添加状态或转换,您只需要修改图表 如果还有人感兴趣,以下是我的看法: 在状态机中,对象可以处于不同的状态,但我们并不真正关心它们在这些状态下的行为。事实上,我们只关心当对象转换到下一个状态时应用了什么操作。如果在Java中实现状态机,状态将只是一个枚举或字符串,并且将有一个带有doAction()方法的转换类 另一方面,在状态模式中,您并不真正关心转换,而是关心对象在这些状态下的行为。转换只是一个实现细节,使您的状态行为彼此解耦。每个状态都是一个单独的类,有自己的doAction()方法 说状态模式使状态机过时是不正确的。如果每个状态的行为都很重要,状态模式将很有用,例如在游戏程序中
inner class StateContext : State {
private var stateContext: State? = null
private var lockState: Boolean = false
fun isLockState(): Boolean {
return lockState
}
fun setLockState(lockState: Boolean): StateContext {
this.lockState = lockState//no further actions allowed. useful if you need to permenatley lock out the user from changing state.
return this
}
fun getState(): State? {
return this.stateContext
}
fun setState(state: State): StateContext {
if (!lockState) this.stateContext = state
return this
}
override fun doAction() {
this.stateContext?.doAction()
}
}
public enum LeaveRequestState {
Submitted {
@Override
public LeaveRequestState nextState() {
return Escalated;
}
@Override
public String responsiblePerson() {
return "Employee";
}
},
Escalated {
@Override
public LeaveRequestState nextState() {
return Approved;
}
@Override
public String responsiblePerson() {
return "Team Leader";
}
},
Approved {
@Override
public LeaveRequestState nextState() {
return this;
}
@Override
public String responsiblePerson() {
return "Department Manager";
}
};
public abstract LeaveRequestState nextState();
public abstract String responsiblePerson();
LeaveRequestState state = LeaveRequestState.Submitted;
state = state.nextState();
assertEquals(LeaveRequestState.Escalated, state);
state = state.nextState();
assertEquals(LeaveRequestState.Approved, state);
state = state.nextState();
assertEquals(LeaveRequestState.Approved, state);