Design patterns 正在寻找命令模式替代方案
我已经编写了一个测试自动化框架。该框架是围绕对象和操作构建的。对象可能是文本框。它的操作可能是设置文本、清除、验证文本、启用验证等。框架独立于acitons,因此我们可以随着时间的推移添加更多操作,而无需在框架本身中重新响应。我考虑了两种行动方法。第一种是使用命令模式。在本例中,我将有一个如下所示的界面:Design patterns 正在寻找命令模式替代方案,design-patterns,command,Design Patterns,Command,我已经编写了一个测试自动化框架。该框架是围绕对象和操作构建的。对象可能是文本框。它的操作可能是设置文本、清除、验证文本、启用验证等。框架独立于acitons,因此我们可以随着时间的推移添加更多操作,而无需在框架本身中重新响应。我考虑了两种行动方法。第一种是使用命令模式。在本例中,我将有一个如下所示的界面: 公共界面IAction { void Execute(StringDictionary属性); } 问题是,我们最终会得到许多这样的命令类。 公共类SetTextAction:IActio
公共界面IAction
{
void Execute(StringDictionary属性);
}
问题是,我们最终会得到许多这样的命令类。
公共类SetTextAction:IAction
{
public void Execute(StringDictionary属性)
{
}
}
公共类ClearAction:IAction
{
public void Execute(StringDictionary属性)
{
}
}
公共类验证文本操作:IAction
{
public void Execute(StringDictionary属性)
{
}
}
公共类验证启用选项:IAction
{
public void Execute(StringDictionary属性)
{
}
}
此外,任何共享代码都需要在另一个类中。它似乎增加了代码中的噪声信号比。
我提出的另一种选择是对类型使用实用程序类,对操作使用方法。结果是这样的:
公共类TextboxActions
{
公共静态无效集文本(StringDictionary属性)
{
}
公共静态无效清除(StringDictionary属性)
{
}
公共静态无效验证文本(StringDictionary属性)
{
}
已启用公共静态无效验证(StringDictionary属性)
{
}
}
这样做的好处是,文本框的代码都在一起。此外,多个操作共用的任何代码都可以在同一个类中。不幸的是,这种方法要求我使用反射来“找到”动作方法。这显然不是类型安全的,而且可能很耗时。我添加了一个缓存,这样我就不必两次找到同一个操作,但这增加了代码的复杂性
这两种解决方案中的任何一种都有效,但它们都具有不希望的特性。有人可以建议解决此问题的其他方法吗?为什么不能使用代理?也就是说,遵循一级函数方法。如果您正在考虑将个别IAAction作为具体实例,那么您最好只使用具体的函数指针。这样,您的代码可以继续像上一个示例一样,但不使用反射。委托方法将与此类似吗
public abstract class TestObject
{
public delegate void TestAction(StringDictionary properties);
public void AddTestAction(TestAction action)
{
}
public void Execute()
{
// foreach test action etc.
}
}
public class TestTextBox : TestObject
{
TestTextBox()
{
Initialize();
}
private void Initialize()
{
AddTestAction(new TestObject.TestAction(this.SetText));
AddTestAction(new TestObject.TestAction(this.Clear));
}
public void SetText(StringDictionary properties)
{
}
public void Clear(StringDictionary properties)
{
}
}
您甚至不需要
AddTestAction
。初始化例程可以执行TestAction+=SetText;TestAction+=清除代码>。记住,委托本质上是多播的。这是真的,但它会减少对何时执行的控制和清晰性。如果我想对每个动作做一些标准的准备和清理,那该怎么办?谢谢,最后我做了类似的事情。委托无效测试(IDictionary属性);接口ITestObject{public List GetActions();}