Unterschied zwischen Strategie- und Befehlsmuster

Antworten:

117

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.

Jeffrey Hantin
quelle
27
Nur kurz, ein Befehl hat einen anderen Zweck. Zum Beispiel: CutCommand, DeleteCommand, CopyCommand, SortCommand, .... Eine Strategie hat den gleichen Zweck, aber einen anderen Ansatz. Im Sortieralgorithmus haben wir: BubbleSort, SelectionSort, ...
Hien Nguyen
60

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

}
BalusC
quelle
44

Strategie - Quicksort oder Mergesort [algo change]

Befehl - Öffnen oder Schließen [Aktionsänderung]

Fakrudeen
quelle
8

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.

Asif Malek
quelle
4

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

  1. Es ist ein Verhaltensmuster
  2. Es basiert auf Delegation
  3. Es ändert die Eingeweide des Objekts, indem es das Methodenverhalten ändert
  4. Es wird verwendet, um zwischen einer Familie von Algorithmen zu wechseln
  5. Es ändert das Verhalten des Objekts zur Laufzeit

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:

Beispiel aus der Praxis für das Strategiemuster

Verwenden des Befehlsentwurfsmusters

Ravindra Babu
quelle