【问题标题】:Refactoring Form to State Pattern?将表单重构为状态模式?
【发布时间】:2009-11-30 17:25:34
【问题描述】:

我想重构一些代码。

基本上我要重构的代码是一个表单(使用 System.Windows.Forms;)

它现在的设置方式,取决于您选择的单选按钮,它会显示不同的窗口布局:不同的标签、按钮等。并不总是有很大的不同,但会有所不同。这是很多地方的条件语句垃圾。我想用状态模式重构它。主要有三种状态。

我不确定执行此操作的最佳方法。现在 IState 接口有一个 DoAction() 方法,它执行一些特定于唯一状态的操作,以及一个 DrawForm() 方法,它根据当前状态重新绘制表单......但是,要执行 DrawForm(), State 类需要能够访问 Form 的成员变量。这就是让我陷入困境的原因。我真的不想暴露他们。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 据我所知,状态模式 DID 要求那些具体的状态类可以访问“上下文”(在您的情况下是表单)。听起来访问这些成员变量是不可避免的。
  • 谢谢,我不得不给你的评论一些爱,因为没有一个答案可以支持,哈哈。

标签: c# design-patterns refactoring


【解决方案1】:

你可以让你的状态类嵌套在你的表单中。然后,他们将能够访问表单字段而无需公开它们。

【讨论】:

  • 这几乎正是我需要对我的设置方式感觉良好的东西。不知何故,我完全忘记了嵌套类。
【解决方案2】:

如果您主要关心的是封装表单内容,并且您希望将状态机保留在外部,我不久前有一个类似的问题,您可以查看答案 here - 基本上它需要创建一个私有内部 ' action 类可以访问表单方法,然后将其传递给状态机,以便它可以使用 action 类间接调用表单方法。

【讨论】:

    【解决方案3】:

    我不知道这是否有帮助,但为什么不使用类似策略模式的东西来绘制表单呢?

    类似

    interface IDrawStrategy
    { 
       void Draw(FormType form);
    }
    

    然后,当您选择表单所处的状态时,您可以分配表单的绘制策略。是的,您仍然需要让 draw 方法访问 Forms 变量以允许它定位它们,但它至少允许您更轻松地根据状态添加不同的外观。

    【讨论】:

    • 我对表单所在的每个状态都有一个 DrawForm() 方法。它与您所说的非常相似。
    【解决方案4】:

    在想要提取表单的“状态”时,您正在描述一种更广为人知的“演示模型”模式。通过阅读this article by Martin Fowler,您将找到一些关于您通常希望表单和状态如何交互的有用信息和提示。在您的情况下,您的表单是“视图”,您的状态是演示模型。与往常一样,福勒在回答这个问题及其他方面做得很好。

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2017-09-09
      相关资源
      最近更新 更多