Quelle est la différence entre le modèle de stratégie et le modèle de commande ? Je recherche également quelques exemples en Java.
En règle générale, le modèle de commande est utilisé pour créer un objet à partir de ce qui doit être fait - pour prendre une opération et ses arguments et les envelopper dans un objet à enregistrer, conservé pour annulation, envoyé à un site distant, etc. Il y aura généralement un grand nombre d'objets de commande distincts qui passeront par un point donné dans un système au fil du temps, et les objets de commande contiendront différents paramètres décrivant l'opération demandée.
Le modèle de stratégie, d'autre part, est utilisé pour spécifier comment quelque chose doit être fait, et se branche sur un objet ou une méthode plus grande pour fournir un algorithme spécifique. Une stratégie de tri peut être un tri par fusion, un tri par insertion ou peut-être quelque chose de plus complexe comme l'utilisation du tri par fusion uniquement si la liste est supérieure à une taille minimale. Les objets de stratégie sont rarement soumis au genre de brassage de masse à propos de ces objets de commande, au lieu d'être souvent utilisés à des fins de configuration ou de réglage.
Les deux modèles impliquent la factorisation du code et éventuellement des paramètres pour les opérations individuelles de la classe d'origine qui les contenait dans un autre objet pour permettre 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 [changement d'algo]
Commande - Ouvrir ou fermer [changement d'action]
La principale différence est que la commande effectue une action sur l'objet. Cela peut changer l'état d'un objet.
Alors que la stratégie décide comment traiter l'objet. Il encapsule une logique métier.
Le modèle de stratégie est utile lorsque vous disposez de 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 de HttpServlet code:
La méthode service()
dirigera la demande de l'utilisateur vers doGet () ou doPost () ou une autre méthode selon le type de méthode.
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);
}
}
Principales caractéristiques du modèle de stratégie
Le modèle de commande est utilisé pour activer le couplage lâche entre l'invocateur et le récepteur. La commande, ConcreteCommand, Receiver, Invoker et Client sont les principaux composants de ce modèle.
Différents récepteurs exécuteront la même commande via Invoker & Concrete Command, mais la mise en œuvre de la commande variera dans chaque récepteur.
par exemple. Vous devez implémenter les fonctionnalités "On" et "Off" pour TV & DVDPlayer . Mais TV et DVDPlayer auront une implémentation différente pour ces commandes.
Jetez un œil aux articles ci-dessous avec des exemples de code: