2

我在我的系统中实现了一个命令模式,主要是因为我有几个层,我需要远程“调用”逻辑。

class DoWorkCommandMessage { int param; }

class DoWorkCommandHandler : Handler<DoWorkCommandMessage>
{
    Execute(MyObject object) {
       object.DoWork(message.param);
    }
}

class MyObject
{
    void DoWork(int param) {
        _proxy.SendMessage(new DoWorkBinaryMessage(param));
    }
}

如您所见,我基本上收到一条消息,将其转换为方法调用,然后将其转换回发送到另一层的消息。

我觉得这里有问题。

我最终重构了 MyObject 以删除所有方法,并用一个简单的 ProcessMessage 方法替换它们,该方法接收一条消息,翻译它,然后分派它。

这没关系,除了 MyObject 最终大部分只是转换代码,而不是“对象”......

为了进行单元测试,我必须继续调用 ProcessMessage() 而不是直接调用方法。

我正在寻找关于“消息传递和转换”与“消息 -> 方法 -> 消息”方法之间的这场战斗的想法。显然消息和方法是密切相关的。

4

1 回答 1

1

我认为混乱和/或困难在于您实际上并没有使用命令模式。您将其与消息传递混合。您甚至可以以您的命令的名义看到这一点DoWorkCommandMessage...。在经典的 Command 模式中,工作实际上是由 Command 对象完成的。在消息传递方法中,消息作为 DTO 传递并由处理程序执行。

为了进一步说明,我有一个应用程序使用

AbstractCommand
+ Execute()
+ CanUndo()
+ Undo()
+ CanChain(cmd)
+ Chain(cmd)

该类的一个具体实例是:

MoveUnitCommand  // a unit is a graphic piece on a game board
+ UnitId
+ Destination
+ Execute()
  {
      units = Units.Find(UnitId)
      prevCoords = units.Position
      units.Position = Destination
  }
+ CanUndo() { return true; }
+ Undo()
  {
      units = Units.Find(UnitId)
      units.Position = prevCoords 
  }
+ etc, etc

请注意,命令子类不仅描述了要做什么,它实际上作用于您的系统状态。

于 2011-12-15T13:46:15.467 回答