使用命令模式

时间:2015-05-19 15:27:58

标签: java design-patterns

我们正在尝试将命令模式应用于我们的一个项目。每个命令对象都有不同种类和数量的参数。哪种模式最适合创建这些命令对象?我目前正在研究抽象工厂和构建器模式。我仍然是设计模式的业余爱好者。有人可以推荐一种最符合我要求的模式吗?

1 个答案:

答案 0 :(得分:3)

据我所知,传统上没有用于创建命令的模式。这是命令模式的UML:

Command pattern in UML

正如您在上面所看到的,ConcreteCommand直接与CommandFactory.createCommand(...)相关联,模式甚至表示它会创建它们。

  

每个命令对象都有不同种类和数量的参数。

此细节将难以将对象创建与客户端代码分离。

一种简单的方法是使用所谓的Simple Factory (aka Concrete Factory)

Simple Factory pattern with Command pattern

这里的意图是使用new CommandA(...)方法封装命令的创建。客户端代码不想知道createCommand(...)等的详细信息。

但是,由于每个具体Command的构造函数具有不同的参数,因此您需要客户端将该信息提供给Client方法。在我看来,这种模式不会带来太多好处,因为无论是否有模式,客户都必须提供几乎相同数量的细节。如果您不希望客户端知道ConcreteCommands的确切名称,那可能会很好。

例如,如果没有Simple Factory模式,new CommandA(arg1, arg2)必须执行Client(直接耦合到具体命令)。使用简单工厂模式,CommandFactory.createCommand("A", arg1, arg2)必须执行CommandD,其中“A”(或类似的东西)是ConcreteCommand要创建的判别式。如果您在设计中添加了Client,那么createCommand("D", ...)仍然需要更改(必须调用CommandFactory您必须更新{ {1}}。看起来很复杂,效果不大。

使用工厂方法或抽象工厂模式似乎更复杂,但您的问题并未提供足够的细节以确定无疑。