首页 > 解决方案 > 我应该如何设计这个自动改变状态的程序?

问题描述

我有一个名为 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();
    }
}

标签: design-patterns

解决方案


在您的 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() 函数调用程序没有在需要停止它的同一线程/进程中运行。


推荐阅读