design-patterns - 我应该如何设计这个自动改变状态的程序?
问题描述
我有一个名为 M 的东西,它具有三种状态。当它处于一种状态时,它应该做某事,然后立即切换到另一种状态。我的代码可以简单地满足这一点,但它有一个不好的效果,一旦它开始运行,函数就永远不会返回。
那么,我该如何设计这个程序呢?
class M {
State state;
func a() {
doSomethingA();
self.state = B;
b();
}
func b() {
doSomethingB();
self.state = C;
c();
}
func c() {
doSomethingC();
self.state = A;
a();
}
}
解决方案
在您的 M 类中,您已将这 3 个方法创建为没有任何退出条件的无限循环。
a() -> invokes b() -> invokes c() -> invokes a()
让我们添加一个退出条件检查,如下所示。
class M {
State state;
bool tobeStopped;
func a() {
doSomethingA();
self.state = B;
if (tobeStopped) {
tobeStopped = false;
} else {
b();
}
}
func b() {
doSomethingB();
self.state = C;
if (tobeStopped) {
tobeStopped = false;
} else {
c();
}
}
func c() {
doSomethingC();
self.state = A;
if (tobeStopped) {
tobeStopped = false;
} else {
a();
}
}
func stop() {
tobeStopped = true;
}
}
现在,任何希望停止它的客户端都需要调用 stop() 函数。
确保 a()、b() 和 c() 函数调用程序没有在需要停止它的同一线程/进程中运行。
推荐阅读
- javascript - 如何在 Vue js 中创建一个组件以永远不会删除我添加到其中的数据?当我切换路由时,组件会删除它获得的所有数据
- python - python中的递归示例
- javascript - 如何确定 JavaScript 中的两个 IANA 时区是否相同?
- typescript - 允许泛型仅是对象的数组键
- python - 使用 python 检索 MusicBrainz 指纹
- java - Spring Boot Hibernate 属性未从属性文件中获取
- java - 如何更改方法的多个传入变量,然后在 Java 中返回所述变量?
- javascript - React 应用程序路由器
- string - 将 json 格式时间戳转换为 golangs time.Time
- python - 在树莓派上下载 TensorFlow