Différence entre le modèle de stratégie et le modèle de commande

Quelle est la différence entre le modèle de stratégie et le modèle de commande ? Je cherche également des exemples en Java.

Généralement, le modèle de commande est utilisé pour créer un object en dehors de ce qui doit être fait – pour effectuer une opération et ses arguments et les envelopper dans un object à consigner, à annuler, à envoyer à un site distant, etc. aura tendance à être un grand nombre d’objects Command distincts qui traversent un point donné dans un système au fil du temps, et les objects Command contiendront divers parameters décrivant l’opération demandée.

Le modèle de stratégie, d’autre part, est utilisé pour spécifier comment faire quelque chose, et se connecte à un object ou à une méthode plus grande pour fournir un algorithme spécifique. Une stratégie de sorting peut être un sorting de fusion, un type d’insertion ou quelque chose de plus complexe, comme l’utilisation d’un sorting de fusion uniquement si la taille est supérieure à une taille minimale. Les objects de stratégie sont rarement soumis au armsage de masse à propos des objects de commande, mais sont souvent utilisés à des fins de configuration ou de réglage.

Les deux modèles impliquent la factorisation du code et éventuellement des parameters pour des opérations individuelles à partir de la classe d’origine qui les contenait dans un autre object pour assurer une variabilité indépendante. Les différences concernent les cas d’utilisation rencontrés dans la pratique et l’intention derrière chaque modèle.

Les mots sont déjà donnés. Voici la différence de code concret.

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. } } 

Stratégie – Quicksort ou Mergesort [algo change]

Commande – Ouvrir ou Fermer [action change]

Le modèle de stratégie est utile lorsque vous avez plusieurs implémentations (algorithmes) pour une fonctionnalité donnée et que vous souhaitez modifier l’algorithme à l’exécution en fonction du type de paramètre.

Un bon exemple du code HttpServlet :

service() méthode service() dirigera la requête de l’utilisateur vers doGet () ou doPost () ou une autre méthode en fonction du type de méthode.

 protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Ssortingng 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); } } 

Principales caractéristiques du modèle de stratégie

  1. C'est un modèle comportemental
  2. C'est basé sur la délégation
  3. Il modifie les entrailles de l'object en modifiant le comportement de la méthode
  4. Il permet de passer d'une famille d'algorithmes à l'autre
  5. Il modifie le comportement de l'object au moment de l'exécution

Le modèle de commande est utilisé pour permettre un couplage libre entre Invoker et Receiver. Command, ConcreteCommand, Receiver, Invoker et Client sont des composants majeurs de ce modèle.

Différents récepteurs exécuteront la même commande via Invoker & Concrete Command mais l'implémentation de Command variera dans chaque récepteur.

Vous devez par exemple implémenter les fonctionnalités "On" et "Off" pour TV & DVDPlayer . Mais TV et DVDPlayer auront une implémentation différente pour ces commandes.

Regardez ci-dessous les messages avec des exemples de code:

Real World Exemple de modèle de stratégie

Utilisation du modèle de conception de commandes

La principale différence est que la commande effectue une action sur l’object. Cela peut changer l’état d’un object.

Tandis que la stratégie décide comment traiter l’object. Il encapsule une certaine logique métier.