GUI作为有限状态机

时间:2009-10-26 12:27:08

标签: .net winforms user-interface design-patterns

要实现应用程序的GUI,我希望将所有逻辑从一种形式转移到另一种形式。此GUI管理器将表现为有限状态机。虽然我认为我已经在某处看到过这种实现,但我找不到与这种解决方案相匹配的设计模式。

表单如下所示:

public class Login : Form
{
    ...

    private void EnterButton_Click()
    {
        ...

        string user = loginTextBox.Text;
        string password = passwordTextBox.Text;
        bool isValid = SecurityManager.CheckUserLogin(user,password);

        GUIManager.FormEnd(FormLogin,new LoginData(user, pass, isValid));
    }

    ...
}

GUI管理器将执行以下操作:

public class GUIManager
{
    ...

    public void FormEnd(FormType type, FormData data)
    {
        switch (type)
        {
            ...
            case FormLogin:
                LoginData ld = (LoginData)data;
                if (ld.Valid)
                {
                    m_loginForm.Hide();
                    m_mainForm.Show();
                }
            ...
        }
    }

    ...
}

达到这一点,我有以下几个问题:是否有一个设计模式正式化这个想法?如果有,.NET会以某种方式支持它吗?如果没有,这听起来像是一个好的实现想法吗?谢谢!

3 个答案:

答案 0 :(得分:6)

State design pattern描述了如何实现有限状态机。

在UI中控制屏幕有许多略有不同的设计模式,但我认为Application Controller design pattern符合您的要求。

答案 1 :(得分:4)

这是一个好主意!事实上,它之前已经完成了很多,可能是可扩展应用程序开发中使用的最常见的模式(想想像Visual Studio,Eclipse之类的IDE)。

来自MS模式和实践组的一个示例SCSF (which leverages CAB),使用此模式开箱即用,在WinForms和WPF中构建可插入和可扩展的复合应用程序。它使用的实际模式涉及构建称为WorkItems的分层状态机,它控制用例并流经应用程序。在我将它作为我自己的想法实现之前,我会研究一下模式和实践的人是如何做到的。我已经在很多场合使用它,这非常值得。

答案 2 :(得分:1)

在Java世界中,您可以将Struts或JSF应用程序视为FSM(此页面上的此事件/状态将我们带到该页面/状态。

在传统的基于Web的UI中对流进行建模时,我确实发现使用FSM是一种非常有用的分析工具。您可以非常快速地捕获应用程序行为的本质。 page state 之间几乎存在一对一的对应关系。我会有一个状态模型和相关的数据模型。

现在我们有更丰富的UI利用AJAX,应用程序状态和“页面”之间的对应关系不太明显。但是你仍然可以推断应用程序的行为:这里用户正在执行 this ,当他们完成时可以执行操作X或Y,然后他们就可以 。所以状态,事件和转换仍然存在,只是他们的代表性更加“虚拟”。