1

我正在做一个通过池化机制一直监控状态的系统。一旦一个状态转移到另一个状态,做一些事情来进一步处理。

我想出的一个好主意是EventHandler,依赖于状态转换。但是我发现识别状态转换可能需要很多条件。

(例如,初始 -> 开启、开启 -> 关闭、开启 -> 维护、维护 -> 开启、...)

有没有改善这个问题的好方法?或任何建议?谢谢!

class StateMonitor
{
    public delegate void Mydelegate();
    public event Mydelegate SomethingHappened;
    public string _state;
    public StateMonitor()
    {
        SomethingHappened += new Mydelegate(monitor);
        _state = "Initial";
    }
    public string state
    {
        get
        {
            return this._state;
        }
        set
        {
            string temp = value;
            if (SomethingHappened != null)
            {
                if(this.state =="Initial" &&  temp =="On") //state transition
                SomethingHappened();
            }
        }
    }
    public void monitor()
    {
        Console.WriteLine("Happened");
    }
}
4

2 回答 2

1

真正需要的是状态机。例如,您可以从开启到关闭吗?

这是让您开始使用状态机的答案。

您使用 1 个委托实现的方式的问题是每个状态都将开始使执行工作的方法更大。在将来的某个时候,该方法将无法维护,您现在可以通过不同的设计来避免这种情况。

于 2013-07-03T04:07:53.187 回答
0

也许enum对你来说可能是States一个签名的改变,以便你Delegate处理过渡,例如:

class StateMonitor
{
    public enum States { initial, on, off, maintaining };
    public delegate void Mydelegate(States stFrom, States stTo);
    public event Mydelegate SomethingHappened;
    public States _state;

    public StateMonitor()
    {
        SomethingHappened += new Mydelegate(monitor);
        _state = States.initial;
    }
    public States state
    {
        get
        {
            return this._state;
        }
        set
        {
            if (SomethingHappened != null)
            {
                SomethingHappened(this._state, value);
            }
            _state = value;
        }
    }
    public void monitor(States stateFrom, States stateTo)
    {
        if (stateFrom == States.initial && stateTo == States.on)
        {
            // Do something for from Intitial state to On State
        }
        else if (stateFrom == States.on && stateTo == States.off)
        {
            // Do something for from On state to Off State
        }
        //... the rest of the code here
    }
}
于 2013-07-03T03:59:27.530 回答