Frage

Was ist der Unterschied zwischen den Strategiemuster und die Befehlsmuster? Ich suche auch einige Beispiele in Java.

War es hilfreich?

Lösung

Normalerweise wird das Befehlsmuster verwendet, um ein Objekt aus Was getan werden muss - Um eine Operation und ihre Argumente zu nehmen und sie in ein zu protokolliertes Objekt, für Rückgänger, an eine abgelegene Stelle zu versenden usw. Es gibt tendenziell eine große Anzahl verschiedener Befehlsobjekte, die einen bestimmten Punkt durchlaufen In einem System über die Zeit und die Befehlsobjekte werden unterschiedliche Parameter enthalten, die den angeforderten Vorgang beschreiben.

Das Strategiemuster dagegen wird verwendet, um festzulegen wie Es sollte etwas getan werden und an ein größeres Objekt oder eine größere Methode angeschlossen werden, um einen bestimmten Algorithmus bereitzustellen. Eine Strategie zum Sortieren könnte eine Zusammenführungsart sein, eine Einfügungssorte sein oder vielleicht etwas Komplexeres, als nur die Zusammenführungsart verwenden, wenn die Liste größer als eine minimale Größe ist. Strategieobjekte werden selten der Art von Massenschlurft über diese Befehlsobjekte unterzogen, sondern häufig für Konfigurations- oder Abstimmungszwecke verwendet.

Beide Muster beinhalten die Faktorierung des Codes und möglicherweise den Parametern für einzelne Operationen aus der ursprünglichen Klasse, die sie in ein anderes Objekt enthielten, um eine unabhängige Variabilität zu gewährleisten. Die Unterschiede sind in den Anwendungsfällen in der Praxis und der Absicht hinter jedem Muster.

Andere Tipps

Wörter sind bereits gegeben. Hier ist der Unterschied im Betoncode.

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

}

Strategie - Quicksort oder Mergesort [Algo -Änderung

Befehl - Öffnen oder schließen [Aktionsänderung

Der Hauptunterschied besteht darin, dass der Befehl eine Aktion über das Objekt ausübt. Es kann den Zustand eines Objekts ändern.

Während der Strategie entscheidet, wie das Objekt verarbeitet wird. Es fasst eine Geschäftslogik zusammen.

Strategie Muster ist nützlich, wenn Sie mehrere Implementierungen (Algorithmen) für eine bestimmte Funktion haben und den Algorithmus je nach Parametertyp zur Laufzeit ändern möchten.

Ein gutes Beispiel von HttpServlet Code:

service() Die Methode leitet die Anforderung des Benutzers an dodget () oder dopost () oder eine andere Methode abhängig vom Methodentyp.

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);
    }
    }

Hervorragende Merkmale des Strategiemusters

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

Befehl Das Muster wird verwendet, um eine lose Kopplung zwischen Invoker und Empfänger zu ermöglichen. Befehl, konkrete Zugriff, Empfänger, Invoker und Client sind Hauptkomponenten dieses Musters.

Verschiedene Empfänger führen denselben Befehl über den Befehl "Inconcrete" aus, aber die Implementierung des Befehls variiert in jedem Empfänger.

zB Sie müssen die Funktionalität "und" aus "implementieren TV & DVDPlayer. TV und DVDPlayer haben jedoch eine andere Implementierung für diese Befehle.

Schauen Sie sich folgende Beiträge mit Codebeispielen an:

Beispiel für reale Welt für das Strategiemuster

Verwenden des Befehlsdesignmusters

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top