Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 正在寻找命令模式替代方案_Design Patterns_Command - Fatal编程技术网

Design patterns 正在寻找命令模式替代方案

Design patterns 正在寻找命令模式替代方案,design-patterns,command,Design Patterns,Command,我已经编写了一个测试自动化框架。该框架是围绕对象和操作构建的。对象可能是文本框。它的操作可能是设置文本、清除、验证文本、启用验证等。框架独立于acitons,因此我们可以随着时间的推移添加更多操作,而无需在框架本身中重新响应。我考虑了两种行动方法。第一种是使用命令模式。在本例中,我将有一个如下所示的界面: 公共界面IAction { void Execute(StringDictionary属性); } 问题是,我们最终会得到许多这样的命令类。 公共类SetTextAction:IActio

我已经编写了一个测试自动化框架。该框架是围绕对象和操作构建的。对象可能是文本框。它的操作可能是设置文本、清除、验证文本、启用验证等。框架独立于acitons,因此我们可以随着时间的推移添加更多操作,而无需在框架本身中重新响应。我考虑了两种行动方法。第一种是使用命令模式。在本例中,我将有一个如下所示的界面:

公共界面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();}