Was ist der Unterschied zwischen dem Strategiemuster und dem Befehlsmuster ? Ich suche auch nach Beispielen in Java.
Was ist der Unterschied zwischen dem Strategiemuster und dem Befehlsmuster ? Ich suche auch nach Beispielen in Java.
Antworten:
In der Regel wird das Befehlsmuster verwendet, um ein Objekt aus dem zu machen, was getan werden muss - um eine Operation und ihre Argumente in ein Objekt zu packen, das protokolliert, zum Rückgängigmachen gehalten, an einen Remote-Standort gesendet usw. wird Es handelt sich in der Regel um eine große Anzahl unterschiedlicher Befehlsobjekte, die im Laufe der Zeit einen bestimmten Punkt in einem System durchlaufen, und die Befehlsobjekte enthalten unterschiedliche Parameter, die die angeforderte Operation beschreiben.
Das Strategiemuster wird andererseits verwendet, um festzulegen, wie etwas getan werden soll, und wird in ein größeres Objekt oder eine größere Methode eingesteckt, um einen bestimmten Algorithmus bereitzustellen. Eine Strategie zum Sortieren kann eine Zusammenführungssortierung, eine Einfügungssortierung oder etwas Komplexeres sein, z. B. die Verwendung der Zusammenführungssortierung, wenn die Liste größer als eine Mindestgröße ist. Strategieobjekte werden selten der Art von Massenmischungen unterzogen, die Befehlsobjekte ausführen, sondern werden häufig für Konfigurations- oder Optimierungszwecke verwendet.
Bei beiden Mustern werden der Code und möglicherweise die Parameter für einzelne Operationen aus der ursprünglichen Klasse, die sie enthielten, in ein anderes Objekt einbezogen, um eine unabhängige Variabilität zu gewährleisten. Die Unterschiede liegen in den in der Praxis auftretenden Anwendungsfällen und der Absicht hinter jedem Muster.
Worte sind bereits gegeben. Hier ist der Unterschied im konkreten Code.
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.
}
}
Der Hauptunterschied besteht darin, dass der Befehl eine Aktion für das Objekt ausführt. Dies kann den Status eines Objekts ändern.
Während Strategie entscheidet, wie das Objekt verarbeitet werden soll. Es kapselt einige Geschäftslogik.
Das Strategiemuster ist nützlich, wenn Sie mehrere Implementierungen (Algorithmen) für ein bestimmtes Feature haben und den Algorithmus zur Laufzeit abhängig vom Parametertyp ändern möchten.
Ein gutes Beispiel aus dem HttpServlet- Code:
service()
Die Methode leitet die Benutzeranforderung je nach Methodentyp an doGet () oder doPost () oder eine andere Methode weiter.
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);
}
}
Hauptmerkmale des Strategiemusters
Das Befehlsmuster wird verwendet, um eine lose Kopplung zwischen Invoker und Receiver zu ermöglichen. Befehl, ConcreteCommand, Receiver, Invoker und Client sind Hauptkomponenten dieses Musters.
Verschiedene Empfänger führen denselben Befehl über Invoker & Concrete Command aus, aber die Implementierung des Befehls variiert in jedem Empfänger.
zB Sie müssen die Funktionen "Ein" und "Aus" für TV & DVDPlayer implementieren . TV und DVDPlayer haben jedoch unterschiedliche Implementierungen für diese Befehle.
Schauen Sie sich die folgenden Beiträge mit Codebeispielen an: