strategy patrones patron diseño diferencia comportamiento comando java design-patterns strategy-pattern command-pattern

java - patrones - Diferencia entre patrón de estrategia y patrón de comando



patrones de diseño de comportamiento (5)

Estrategia - Quicksort o Mergesort [cambio de algo]

Comando - Abrir o Cerrar [cambio de acción]

¿Cuál es la diferencia entre el patrón de estrategia y el patrón de comando ? También estoy buscando algunos ejemplos en Java.


La principal diferencia es que el comando realiza alguna acción sobre el objeto. Puede cambiar el estado de un objeto.

Mientras que la estrategia decide cómo procesar el objeto. Encapsula cierta lógica de negocios.


Las palabras ya están dadas Aquí está la diferencia en el código concreto.

public class ConcreteStrategy implements BaseStrategy { @Override public void execute(Object argument) { // Work with passed-in argument. } }

public class ConcreteCommand implements BaseCommand { private Object argument; public ConcreteCommand(Object argument) { this.argument = argument; } @Override public void execute() { // Work with own state. } }


Normalmente, el patrón de comando se usa para hacer que un objeto quede fuera de lo que se necesita hacer : tomar una operación y sus argumentos y envolverlos en un objeto que se va a registrar, retener para deshacer, enviar a un sitio remoto, etc. tenderá a ser una gran cantidad de objetos de Comando distintos que pasan a través de un punto determinado en un sistema a lo largo del tiempo, y los objetos de Comando mantendrán diversos parámetros que describan la operación solicitada.

El patrón de Estrategia, por otro lado, se usa para especificar cómo se debe hacer algo y se conecta a un objeto o método más grande para proporcionar un algoritmo específico. Una estrategia para ordenar podría ser un tipo de combinación, podría ser un tipo de inserción, o tal vez algo más complejo como solo usar el tipo de fusión si la lista es más grande que un tamaño mínimo. Los objetos de estrategia rara vez están sujetos al tipo de mezcla masiva sobre la que se encuentran los objetos de Comando, en cambio, a menudo se utilizan para fines de configuración o ajuste.

Ambos patrones implican factorizar el código y posiblemente los parámetros para las operaciones individuales fuera de la clase original que los contenía en otro objeto para proporcionar una variabilidad independiente. Las diferencias están en los casos de uso que se encuentran en la práctica y la intención detrás de cada patrón.


El patrón de estrategia es útil cuando tiene múltiples implementaciones (algoritmos) para una característica dada y desea cambiar el algoritmo en tiempo de ejecución según el tipo de parámetro.

Un buen ejemplo del código HttpServlet :

service() método service() dirigirá la solicitud del usuario a doGet () o doPost () u otro método según el tipo de método.

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn''t support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < (lastModified / 1000 * 1000)) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } }

Características sobresalientes del patrón Estrategia

  1. Es un patrón de comportamiento
  2. Se basa en la delegación
  3. Cambia las agallas del objeto modificando el comportamiento del método
  4. Se usa para cambiar entre familia de algoritmos
  5. Cambia el comportamiento del objeto en tiempo de ejecución

El patrón de comando se usa para habilitar el acoplamiento libre entre Invoker y Receiver. Command, ConcreteCommand, Receiver, Invoker y Client son componentes principales de este patrón.

Diferentes Receptores ejecutarán el mismo Comando a través del Comando Invocador y Concreto, pero la implementación del Comando variará en cada Receptor.

Por ejemplo, debe implementar las funciones "Encendido" y "Apagado" para TV y DVDPlayer . Pero TV y DVDPlayer tendrán una implementación diferente para estos comandos.

Echa un vistazo a las siguientes publicaciones con ejemplos de código:

Ejemplo del mundo real del patrón de estrategia

Uso del patrón de diseño de comando