Respondiendo a una pregunta muy antigua. (¿Alguien está viendo las últimas respuestas en lugar de las más votadas?)
Es una confusión válida debido a las similitudes. Los patrones de Estrategia y Comando utilizan la encapsulación . Pero eso no los hace iguales.
La diferencia clave es comprender que se encapsula. El principio OO, ambos patrones dependen de, es Encapsula lo que varía.
En caso de estrategia, lo que varía es algoritmo. Por ejemplo, un objeto de estrategia sabe cómo exportar a un archivo XML, mientras que el otro lo envía a, por ejemplo, JSON. Se mantienen diferentes algoritmos (encapsulado) en diferentes clases. Es tan simple como eso.
En caso de comando, lo que varía es solicitud sí mismo. La solicitud puede venir de File Menu > Delete
o Right Click > Context Menu > Delete
o Just Delete Button pressed
. Los tres casos pueden generar 3 objetos de comando del mismo tipo.Estos objetos de comando solo representan 3 solicitudes de eliminación; no algoritmo de eliminación. Como las solicitudes ahora son un montón de objetos, podríamos gestionarlas fácilmente. De repente, se vuelve trivial proporcionar funcionalidades como deshacer o rehacer.
No importa cómo el comando implementa la lógica solicitada. Al ejecutar execute(), puede implementar un algoritmo para activar la eliminación o incluso puede delegarlo a otros objetos, incluso puede delegar en una estrategia. Es solo el detalle de implementación del patrón de comando. Es por esto que se denomina como comando pesar de que no es una forma educada de solicitud: -)
contraste con la estrategia; este patrón solo se refiere a la lógica real que se ejecuta. Si hacemos eso, ayuda a lograr diferentes combinaciones de comportamientos con un conjunto mínimo de clases, evitando así la explosión de clase.
Creo que Command nos ayuda a ampliar nuestra comprensión de la encapsulación, mientras que Strategy proporciona un uso natural de la encapsulación y el polimorfismo.
Entonces, si tuviera un sistema que filtrara los resultados con un "filtro de canalización" y utilizara delegados como filtros (donde cada uno de los algoritmos del filtro estaría encapsulado dentro de una función) ¿se consideraría un patrón de comando? En este caso, veo que el delegado de la función de filtro proporciona un tipo de contrato para lo que cada filtro debe cumplir en términos de entrada y salida. – KTF
@KTF, no. El patrón de comando emplea un objeto que tiene la mayoría (si no toda) la información necesaria (p. Ej., Receptor, selector, argumentos) para invocar el método de un objeto. Es un patrón simplista que se puede utilizar en otros patrones de diseño, como Chain of Responsibility, Collection y el patrón Pipeline que describes. El "contrato de tipo" provisto por sus delegados es otro patrón, Interface. – Huperniketes