正确执行“命令”

本文关键字:命令 执行 | 更新日期: 2023-09-27 18:19:10

我正在尝试创建一个"命令"的负载-基本上是一个字符串定义的命令名称,大约4个函数与之相关。通常,我会将每个"命令"捆绑到一个静态类中,并且每个命令都有许多不同的静态类。

然而,我也希望能够有一个所有可用命令的列表,这样我就可以通过知道命令名来调用函数——这在静态类中是做不到的。

我想用反射来建立一个列表。我还考虑过使用单例模式,在每个构造函数中,将单个对象添加到所有"命令"类共享的静态列表中。这两种方法都不是特别简洁……

这个场景有设计模式吗?或者人们过去用过什么方法?感谢所有的建议!

我正在使用c#,尽管它与问题并不是很相关。

正确执行“命令”

你已经概述了两种最好的方法。

注册模式是一个类(注册表),其中包含所有可用命令的列表。优点是它很简单,缺点是开发人员需要知道需要注册命令。使用基类来帮助指导开发人员(他们将编写更多的命令)做什么。

pluggable模式是使用反射来查找当前AppDomain中所有加载的类型的模式。这样做的好处是,它可以在应用程序加载后完成,为您提供动态加载程序集的选项。

为了帮助保持代码的可维护性,我建议在指导开发人员(将创建新命令的开发人员)做什么时做最简单的事情。

我不知道我这样做的方式是按照特定的模式建模的,但是我有一个在生产中使用的程序,它使用了Dictionary和接口。界面足够简单

public interface KeyboardActionCommand
{
    void ExecuteOnKeyDown();
    void ExecuteOnKeyUp();
}

在这种情况下,用Dictionary<string, KeyboardActionCommand>制作预定义命令的列表是很容易的。如果在我的情况下,当我最终不得不添加自定义时,例如当我制作一个名为OpenProgramKeyboardActionAcommand的新类时,根据它打开程序的名称推断,但是制作一堆预定义版本的类是不实际的。相反,我必须创建一个类来帮助构建这些类型的命令。不过我的字典里倒是有一些。示例i availableCommands.Add("Open Calculator", new OpenProgramKeyboardActionCommand(@"C:'Windows'System32'calc.exe"));

所以它确实有一个缺点

另一个想法是为字典的值部分创建一个委托。然后你可以创建你的静态类它有一堆实现的委托功能。