Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 用于在状态之间切换或循环的设计模式_Design Patterns_Architecture - Fatal编程技术网

Design patterns 用于在状态之间切换或循环的设计模式

Design patterns 用于在状态之间切换或循环的设计模式,design-patterns,architecture,Design Patterns,Architecture,是否有设计模式(如访问者、策略、状态等)或其他设计原则来帮助设计一个好的解决方案,以模拟实体的状态流,例如任务实体 任务在新状态下开始,然后进入正在处理状态,然后等待批准,然后可以移动到已完成状态或未批准状态,基本上返回到正在处理状态,并提供其他信息,说它是从等待批准回来的 一般来说,我们有一些一般的流,然后我们可以在其中有一些内部流 谢谢 ashilon它不是一种模式,而是一个概念:有限状态机 总之,它是一个状态机,在某一时刻只能有一个活动状态 第一段说: 有限状态机(FSM)或有限状态自动机

是否有设计模式(如访问者、策略、状态等)或其他设计原则来帮助设计一个好的解决方案,以模拟实体的状态流,例如任务实体

任务在新状态下开始,然后进入正在处理状态,然后等待批准,然后可以移动到已完成状态或未批准状态,基本上返回到正在处理状态,并提供其他信息,说它是从等待批准回来的

一般来说,我们有一些一般的流,然后我们可以在其中有一些内部流

谢谢


ashilon

它不是一种模式,而是一个概念:有限状态机

总之,它是一个状态机,在某一时刻只能有一个活动状态

第一段说:

有限状态机(FSM)或有限状态自动机(复数: 自动机(automata)或简单的状态机是 用于设计计算机程序和顺序逻辑的计算 电路。它被认为是一个抽象的机器,可以在一个 有限数量的状态。机器一次仅处于一种状态; 它在任何给定时间处于的状态称为当前状态。信息技术 通过触发启动时,可以从一种状态更改为另一种状态 事件或情况;这称为过渡。特定的FSM是 由其状态列表和每个状态的触发条件定义 过渡


有一种管理状态的模式称为状态设计模式-

它基本上将有限状态机中的各种椭圆/状态表示为基本状态类/接口的子类。在你的情况下,州将被处理,等待批准,完成,不批准等

将有一个状态处理程序类,它将保存系统的当前状态(currentState实例变量),它将是对基本状态类/接口的引用,但将根据系统所处的当前状态保存其中一个子状态

所有可能发生在所有状态上的事件一起将在状态基类中形成方法的超集。那些“能够”处理这些事件的状态将在调用这些事件时编写必要的逻辑。其余的事件将是该州的非法行动。这些事件基本上将状态处理程序类中的currentState从一个状态更改为另一个状态

另外,请注意,您需要有不同状态的实例可用于分配给状态处理程序的currentState属性。你可以为这些州建一个工厂

我希望我能向你们解释一下……不过在白板上要容易得多……如果有什么不清楚的地方,一定要告诉我

为了补充上述解释,我在我的博客上添加了一篇详细的文章,解释州设计模式-

任务以新状态开始,然后进入处理中状态,然后等待批准,然后可以移动到已完成或未批准状态,这实质上是返回处理中状态,并提供附加信息,表示任务已从等待批准状态返回

正如其他人所提到的,有限状态机(FSM)方法是一种建模您想要的行为的方法。状态基本上就是您提到的状态,但是您还需要定义将任务从一个状态转换到下一个状态的转换

在开始编码之前,我建议您绘制FSM草图并向同事(或客户)展示,以确认状态和转换与您试图解决的问题的工作方式一致。在白板上更改图表比更改代码更容易。我使用PlantUML和PlantText.com快速生成图表,但白板更快

我自由地开始了一些事情(我添加了一些任意的转换),但这应该是有意义的。您可能能够删除某些状态,例如,
New
BeingHandled
可能是相同的状态,前提是您无法真正想到将系统从一个状态转换到另一个状态。类似地,如果您所做的只是批准/拒绝任务,则正在处理的
和等待批准的
也可能是相同的状态。尽量使它尽可能简单


最后,当您要编写此代码时,您不必使用状态模式(正如一些人所建议的)。它增加了解决方案的复杂性,因为每个状态都是一个单独的类(有时这可能很有用,但如果有很多状态或转换,则很难维护)。FSM已经存在很长时间了,可以很容易地使用二维数组进行编码。查看问题或询问谷歌。

您是否尝试过使用状态模式?我认为它非常适合你的情况。非常感谢布鲁诺,我会选择这种设计模式。它真的非常适合这种情况。没问题,很乐意帮忙:)好的,但是这个概念允许以已知顺序和任意顺序进行状态转换吗?就像我指定的,在等待批准的某个状态下,它可以转换到下一个状态,也可以转换到上一个状态,这意味着它并不总是一个顺序流,它可以被中断并移回上一个状态。我想知道,关于国家秩序的所有知识都是在哪里定义的,谁在检查过渡到另一个国家的条件?是业务对象本身,即任务类还是其他对象?@ashilon你问的问题太多了,你在评论中这样做。状态机可以前进或后退,这取决于某些给定的条件。我的意思是,我不明白为什么状态机不能做你想做的事。关于如何将其存储在耐用的存储库中,或其他什么,