将表格重构为状态模式?

时间:2009-07-27 00:44:57

标签: c# design-patterns refactoring

我想重构一些代码。

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

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

我不确定这样做的最好方法。现在,IState接口有一个DoAction()方法,它对特定的State执行特定的操作,以及一个DrawForm()方法,它根据当前状态重新绘制表单...但是,要做Draw​​Form(), State类需要能够访问Form的成员变量。这就是我扔了一个循环。我真的不想暴露它们。

有更好的方法吗?

4 个答案:

答案 0 :(得分:3)

您可以将您的状态类嵌套在表单中。然后,他们将能够访问表单的字段,而不必暴露它们。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我不知道这是否有帮助,但为什么没有类似于绘制表单的策略模式?

这就像

那样
interface IDrawStrategy
{ 
   void Draw(FormType form);
}

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

答案 3 :(得分:0)

在想要提取表单的“状态”时,您正在描述一种更好地称为“表示模型”的模式。您可以通过阅读this article by Martin Fowler找到一些关于您通常希望表单和状态进行交互的一些好信息和提示。在您的情况下,您的表单是“查看”,您的状态是表示模型。和往常一样,福勒在回答这个问题方面做得很好。