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
Java 遍历要执行的命令列表-哪种模式?_Java_Design Patterns_Strategy Pattern_Command Pattern - Fatal编程技术网

Java 遍历要执行的命令列表-哪种模式?

Java 遍历要执行的命令列表-哪种模式?,java,design-patterns,strategy-pattern,command-pattern,Java,Design Patterns,Strategy Pattern,Command Pattern,我编写了一个Java程序,它读取包含要执行的命令的文件(用我自己编写的语言)。命令作为字符串读入并放入数组中。现在,一个“dispatcher”方法将在数组中循环,解释命令并调用相应的方法对其进行操作 这当然会导致一大块嵌套的if语句: if commandReadIn == this, do that... if commandReadIn is of type x, get next element,treat next element as argument... etc. 现在我

我编写了一个Java程序,它读取包含要执行的命令的文件(用我自己编写的语言)。命令作为字符串读入并放入数组中。现在,一个“dispatcher”方法将在数组中循环,解释命令并调用相应的方法对其进行操作

这当然会导致一大块嵌套的if语句:

if commandReadIn == this, do that... 
if commandReadIn is of type x, get next element,treat next element as argument... 
etc. 
现在我只有少数几个命令,但是如果我想添加数百个呢?代码将变得无法维护

现在我想知道是否有可能完全摆脱条件逻辑。命令模式在这里似乎没有多大用处,因为我必须在某个时刻解释字符串。。这意味着很多嵌套的“如果”。如果不可能,以便于添加、编辑或删除命令的方式重新构造命令及其语法的最佳方法是什么。您的实现可以大大简化

1) 使用
execute
方法创建
命令
接口。
2) 为每个命令创建一个实现。
3) 启动程序时,创建命令字符串->命令实现的映射。
4) 读取字符串时,请查找相应的实现并调用它。
5) 或者,您的
execute
方法可以将自定义
Context
对象作为参数,允许您以通用方式传递命令参数。由实现来理解上下文对象并从中检索参数


使用这种方法,您将不会有if语句,除了检查是否从命令实现的缓存中检索到任何内容失败之外。

创建一个静态映射,将操作名称映射到其命令执行器类名。创建一个factory类,该类将返回给定操作的命令执行器实例。

还要检查您的语言是否不仅包含关键字序列,还包含一些参数/运算符等。

如何使用?然后需要编写一个解析器,将命令更改为解析树。可以用于遍历语法检查和执行命令等任务的解析树。

感谢您的回答,我现在已经实现了命令模式。为了简单起见,我现在将包含状态信息的对象而不是上下文传递给execute方法(一些语法更复杂的命令和复合命令需要状态信息)。使用Context类是否更好(我真的不知道如何使用Context)?另外,我想知道我是否真的应该传递状态信息,还是最好让具体的命令从客户端请求状态对象“包含状态信息的对象”是一个上下文!!你做得对。我不会改变任何事情。这样你的命令更容易测试哦,我明白了。。我以为您指的是一个特定的类(或者说接口)。你说得对,像这样的命令更容易测试,我将保持原样。非常感谢你的帮助!