pasar los datos a través de un constructor o trabajos setter, pero requiere el creador del comando para conocer los datos de las necesidades de mando ...
La idea "contexto" es realmente bueno, y yo estaba trabajando en (un marco interno) que lo apalancó hace un tiempo.
Si configura su controlador (componentes de IU que interactúan con el usuario, CLI interpretando comandos de usuario, interpretando parámetros entrantes y datos de sesión, etc.) para proporcionar acceso con nombre a los datos disponibles, los comandos pueden solicitar directamente los datos ellos quieren.
Me gusta mucho la separación que permite una configuración como esta. Piense en capas de la siguiente manera:
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
Si lo hace este "derecho", los mismos comandos y modelo de presentación se pueden utilizar con cualquier tipo de interfaz de usuario.
Llevando esto un paso más allá, el "controlador" de arriba es bastante genérico. Los controles de la interfaz de usuario solo necesitan conocer el nombre del comando que invocarán; ellos (o el controlador) no necesitan tener ningún conocimiento de cómo crear ese comando o qué datos necesita ese comando. Esa es la verdadera ventaja aquí.
Por ejemplo, puede mantener el nombre del comando para ejecutar en un Mapa. Cada vez que el componente se "activa" (generalmente una acción realizada), el controlador busca el nombre del comando, lo instancia, llama a ejecutar y lo empuja a la pila de deshacer (si usa uno).
Sé que esta pregunta data de hace más de cuatro años, pero Juanma y bloparod en realidad dan la respuesta correcta: make 'ICommand' generic (' ICommand '). El 'TArgs' dado encapsula todos los argumentos (se convierte en [Objeto de parámetro] (http://c2.com/cgi/wiki?ParameterObject)). Deberá crear dos objetos por comando: uno para el mensaje; uno por el comportamiento. Esto suena incómodo al principio, pero cuando lo obtienes, nunca mirarás hacia atrás.[Este artículo] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91) describe este modelo en detalle. Una lectura obligada para todos los que leen esta pregunta. –
Steven
@Steven gracias por el enlace a su publicación de blog. Quizás sería bueno si pudieras aclarar cómo el enfoque que describes en él encaja con la pregunta aquí dado que, según tu propia admisión, "no lo consideras [el] Patrón de Comando". Uno podría tener la idea de que su comentario es simplemente autopromoción. – ardila