通过构造函数或设置器传递数据是可行的,但需要命令的创建者知道命令需要的数据......
“上下文”的想法非常好,我正在研究(一个内部)框架,不久前就利用了它。
如果您设置控制器(与用户交互的 UI 组件、解释用户命令的 CLI、解释传入参数和会话数据的 servlet 等)以提供对可用数据的命名访问,命令可以直接请求它们想要的数据。
我真的很喜欢这样的设置允许的分离。考虑分层如下:
User Interface (GUI controls, CLI, etc)
|
[syncs with/gets data]
V
Controller / Presentation Model
| ^
[executes] |
V |
Commands --------> [gets data by name]
|
[updates]
V
Domain Model
如果您“正确”地执行此操作,则可以将相同的命令和演示模型用于任何类型的用户界面。
更进一步,上面的“控制器”非常通用。UI 控件只需要知道它们将调用的命令的名称——它们(或控制器)不需要知道如何创建该命令或该命令需要什么数据。这才是这里真正的优势。
例如,您可以保存要在 Map 中执行的命令的名称。每当组件被“触发”(通常是 actionPerformed)时,控制器都会查找命令名称、实例化它、调用执行并将其推送到撤消堆栈(如果您使用的话)。