2012-07-25 49 views
3

我写了一个Java程序,它读入一个包含要执行的命令的文件(用我自己编写的语言)。这些命令以字符串形式读入并放入数组中。现在一个“调度员” - 方法将遍历数组,解释命令并调用将对其执行操作的相应方法。遍历命令列表来执行 - 哪种模式?

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

if commandReadIn == this, do that... 
if commandReadIn is of type x, get next element,treat next element as argument... 
etc. 

现在我只有命令极少数,但如果我想添加数百什么?该代码将变得无法维护。

现在我想知道是否有可能彻底摆脱条件逻辑。命令模式在这里似乎没有多大用处,因为无论如何,我必须在某个点解释这些字符串。这意味着很多嵌套的“if”。如果这是不可能的,那么重构命令及其语法的最佳方法是什么,以便于添加,编辑或删除命令?

回答

8

使用Command Pattern作为您的命令。您的实施可以大大简化。

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

使用这种方法,您将不会有if语句,除了可能检查以查看您是否无法从缓存的命令实现中检索任何内容。

+1

感谢您的回答,我现在已经实施了命令模式。为了简单起见,我现在将一个包含状态信息而不是Context的对象传递给execute方法(某些命令需要使用更复杂的语法和复合命令的状态信息)。使用Context类会更好吗(我真的不知道如何使用上下文)?另外,我想知道我是否应该真的传递状态信息,或者如果最好具体的命令请求来自客户端的状态对象 – 2012-07-26 11:45:31

+0

“包含状态信息的对象”是上下文!你做得对。我不会改变任何事情。您的命令可以通过这种方式进行测试。 – hvgotcodes 2012-07-26 11:46:53

+0

哦,我明白了..我以为你是指特定的类(或接口,而不是)。你说得对,这些命令更容易测试,我会保持原样。非常感谢你的帮助! – 2012-07-26 12:26:33

2

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

1

检查interpreter pattern另外,如果你的语言不仅包含关键字的序列,但一些参数/运营商等

1

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