[GO] Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Strategiemuster

GoF-Entwurfsmuster sind auch in den Java-Bibliotheken versteckt, die Sie am häufigsten verwenden. Es ist leicht, die geschäftige tägliche Arbeit zu übersehen, aber ab und zu genießen wir das schöne Design, das man als eine Art Kunst bezeichnen kann.

Diese Kunst

Quelldatei

Main.java


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class Main {

    public static void main(String[] args) {
        //Erstellen Sie eine Instanz von GSON
        Gson gson = new GsonBuilder()
                .setFieldNamingStrategy(new MyFieldNamingStrategy())
                .create();

        //Konvertieren Sie Java-Objekte in JSON-Zeichenfolgen
        String json = gson.toJson(new ExampleBean());

        //Ausgabe
        System.out.println(json);
    }
}

MyFieldNamingStrategy.java


import com.google.gson.FieldNamingPolicy;
import com.google.gson.FieldNamingStrategy;
import java.lang.reflect.Field;

public class MyFieldNamingStrategy implements FieldNamingStrategy {

    @Override
    public String translateName(Field field) {
        //Von Mitgliedsvariablen"_"Beseitigen, abschütteln
        String fieldName = FieldNamingPolicy.IDENTITY.translateName(field);
        if (fieldName.startsWith("_")) {
            fieldName = fieldName.substring(1);
        }
        return fieldName;
    }
}

ExampleBean.java


public class ExampleBean {
    //Zu Beginn der Mitgliedsvariablen"_"Es ist angehängt
    private String _firstField = "value";
    private String _secondField = "vaule";
}

Ausführungsergebnis

//Zu Beginn der Mitgliedsvariablen"_"Wird genommen
{"firstField":"value","secondField":"vaule"}

Dies ist eine Szene, in der ein Java-Objekt mithilfe der Gson-Bibliothek in eine JSON-Zeichenfolge konvertiert wird. Wenn Sie es erneut ansehen, werden Sie von der Benutzeroberfläche begeistert sein, die sowohl einfach als auch anpassbar zu sein scheint.

Anerkennungspunkte

Gson ist eine Open Source-Bibliothek von Google, die Java-Objekte <=> JSON ineinander konvertiert. Ich verwende diese Gson-Bibliothek, um die "ExampleBean" -Klasse in JSON zu konvertieren.

Die "ExampleBean" -Klasse wurde wahrscheinlich von einem C ++ - oder Objective-C-Programmierer geschrieben. In Java ungewöhnliche Mitgliedsvariablen wird "\ _" (Unterstrich) vorangestellt. Ich möchte jedoch nicht "\ _" zu dem diesmal generierten JSON hinzufügen.

Gson wurde entwickelt, um "FieldNamingStrategy" auf "GsonBuilder" als Logik zum Bestimmen des Feldnamens (JSON-Schlüsselname) beim Konvertieren eines Java-Objekts in JSON festzulegen. Im "Muster der Vorlagenmethode", das ich im vorherigen Artikel geschrieben habe, war es ein Mechanismus, die übergeordnete Klasse zu erben, um die Funktion anzupassen. Dieses Mal habe ich eine Instanz der Klasse festgelegt. Es scheint eine Designästhetik zu sein, die Vererbung beim Anpassen von Funktionen so wenig wie möglich zu verwenden. Lassen Sie uns gemeinsam erkunden.

Wenn Sie das Strategiemuster nicht verwenden

Der Code am Anfang verwendet das Strategiemuster, aber lassen Sie uns zunächst überlegen, wie das Design ohne das Strategiemuster aussehen würde, als wären Sie der Designer der Gson-Bibliothek.

Ich möchte beim Konvertieren einer Klasse mit "\ _" im Feldnamen in JSON kein "\ _" hinzufügen. Es wird davon ausgegangen, dass viele Klassen konvertiert werden müssen und dass die Felder nicht durch Umgestalten der Klassen umbenannt werden können.

Design mit Vererbung

Klassenvererbung ist das erste, worüber wir in der objektorientierten Programmierung sprechen. Versuchen wir also, mit Vererbung zu entwerfen. Implementieren wir die Logik, die den Feldnamen bestimmt, indem wir die Gson-Klasse [^ 1] erben.

MyGson.java


public class MyGson extends Gson {
    @Override
    protected String translateFieldName(Field field) {
        //Am Anfang des Feldnamens"_"Wenn angehängt, wird die entfernte Zeichenfolge zurückgegeben.
        // "_"Wenn dies nicht der Fall ist, geben Sie es so zurück, wie es ist.
    }
}

Main.java


...
public class Main {

    public static void main(String[] args) {
        //Erstellen Sie eine Instanz von GSON
        Gson gson = new MyGson();

        //Konvertieren Sie Java-Objekte in JSON-Zeichenfolgen
        String json = gson.toJson(new ExampleBean());

        //Ausgabe
        System.out.println(json);
    }
}

Es ist erfrischend als ich erwartet hatte ... Die "MyGson" -Klasse implementiert die Logik zum Übersetzen von Feldnamen, indem die "translateFieldName" -Methode der übergeordneten Klasse überschrieben wird. Die überschriebene Methode wird beim Erstellen einer JSON-Zeichenfolge von der übergeordneten Klasse "Gson" aufgerufen. Diese Methode ist das "Muster der Vorlagenmethode", das ich im vorherigen Artikel geschrieben habe. Es ist einfacher und leichter zu verstehen, als Sie sich vorstellen können.

Probleme beim Entwerfen mit Vererbung

In dieser Situation muss man denken: "Es ist ein überwältigender Sieg für das Muster der Vorlagenmethode. Ich hatte kein Strategiemuster."

Feldnamen sind jedoch nicht die einzigen Dinge, die Gson anpassen kann. Unter Gsons Javadoc gibt es neben Feldnamen noch viele andere anpassbare Punkte.

  1. setExclusionStrategy - Definieren Sie Klassen und Felder, die nicht in JSON enthalten sein sollen
  2. setLongSerializationPolicy - Definiert, ob der Long-Typ eine Zahl oder eine Zahl ist
  3. setDateFormat - Definieren Sie das Format für die Konvertierung des Datumstyps in eine Zeichenfolge

Etc.

Wenn Sie alle diese Anpassungen mit der Vererbung übergeordneter Klassen vornehmen, treten Probleme auf. Das heißt, die Kombination von Funktionen wird explodieren.

Angenommen, Sie verwenden eine Klasse von "Gson1", die die Funktion von 1 oben überschreibt, "Gson2", die die Funktion von 2 überschreibt, und "Gson3", die die Funktion von 3 überschreibt.

1 Funktion 2 Funktionen 3 Funktionen
Gson1 Klasse
Gson2-Klasse
Gson3-Klasse

In dieser Situation benötigen Sie, wenn Sie sowohl neue 1- als auch 2-Funktionen benötigen, eine Gson12-Klasse, die beide Methoden überschreibt. Der Quellcode wird dupliziert, da der Inhalt der Methode genau dem entspricht, der in "Gson1" bzw. "Gson2" beschrieben ist.

1 Funktion 2 Funktionen 3 Funktionen
Gson1 Klasse
Gson2-Klasse
Gson3-Klasse
Gson12 Klasse

Wenn Sie die Funktionen 1 und 3 benötigen, benötigen Sie außerdem die Klasse "Gson13". Wenn Sie die Funktionen 1, 2 und 3 benötigen, müssen Sie die Klasse "Gson123" erstellen.

1 Funktion 2 Funktionen 3 Funktionen
Gson1 Klasse
Gson2-Klasse
Gson3-Klasse
Gson12 Klasse
Gson13 Klasse
Gson123 Klasse
...

Auf diese Weise erhalten Sie, wenn Sie versuchen, es durch ** Vererbung der Gson-Klasse zu lösen, das schlechteste Design, bei dem Sie so viele Klassen benötigen, wie es Funktionskombinationen gibt und der Quellcode dupliziert wird **.

Als eine andere Methode, die die Vererbung verwendet, ist es möglich, die in JSON konvertierte Klasse "ExampleBean" zu erben und jede Methode wie "translateFieldName" hier zu implementieren. Es stößt jedoch immer noch auf das gleiche Problem wie oben und widerspricht der Gson-Spezifikationsphilosophie, POJO (gewöhnliches Java-Objekt) überhaupt in JSON konvertieren zu können.

Bei Verwendung des Strategiemusters

Wenden wir nun das Strategiemuster an. Den Quellcode und das Ausführungsergebnis finden Sie unter [der erste](# this art) erneut.

Der Ablauf dieses Strategiemusters ist wie folgt.

  1. GsonBuilder setzt MyFieldNamingStrategy auf Gson
  2. MyFieldNamingStrategy # translateName wird aufgerufen, wenn Feldnamen in Gson # toJson übersetzt werden

Der Punkt ist, dass der Prozess des Konvertierens von Feldnamen an "MyFieldNamingStrategy" delegiert wird und nicht direkt in der "Gson" -Klasse. Auf diese Weise können ** die Hauptklasse (Gson) und die Konvertierungslogikklasse ( XXXStrategy) getrennt werden **. Die Trennung macht es einfach, die Logik auf einen Blick zu ersetzen oder wiederzuverwenden. wunderschönen!

Die GoF-Definition des Strategiemusters lautet: "Definieren Sie eine Familie von Algorithmen, kapseln Sie jeden einzelnen und machen Sie sie austauschbar. Mit dem Strategiemuster können Clients die von ihnen verwendeten Algorithmen unabhängig voneinander ändern. [^ 2] ". Die "Familie der Algorithmen" entspricht hier Funktionen wie dem Konvertieren von Feldnamen (Klasse "XXXStrategy").

Expertenmeinungen zum Strategiemuster

Viele Experten haben sich auch zur Bewertung des Strategiemusters geäußert.

Hiroshi Yuki

Im Strategiemuster kann der Teil, der den Algorithmus implementiert, in einem kurzen Blick ausgetauscht werden. Das Strategiemuster ist ein Muster, das es einfach macht, Algorithmen (Strategien, Strategien, Strategien) zu wechseln und dasselbe Problem auf unterschiedliche Weise zu lösen.

["Einführung in in Java-Sprache erlernte Entwurfsmuster"](https://www.amazon.co.jp/ Einführende in Java-Sprache erlernte Entwurfsmuster-Yuki-Hiroshi / dp / 4797327030 /)

lang_and_engine

Wenn es um einen etwas komplizierten Algorithmus geht, schneidet ein normaler Programmierer diesen Teil aus und aggregiert ihn. Es sollte auch kompatibel sein, falls es durch einen anderen Algorithmus ersetzt wird.

Aus Liste der 23 GoF-Entwurfsmuster für die Verwendung in Java

Schließlich

Es ist das wahre Vergnügen eines Programmierers, intellektuellen Genuss zu genießen, indem er nur ein paar Codezeilen betrachtet, ohne ins Museum gehen zu müssen.

Wenn Sie ein Ingenieur sind, der mit der Kunst des Strategiemusters sympathisiert, wenden Sie sich bitte an den Einstellungsmanager unseres Unternehmens (Qualysite Technologies Co., Ltd.). Kontaktieren Sie bitte!

Ergänzung (Gson-Tipps)

Im obigen Beispiel wurde die Klasse "FieldNamingStrategy" verwendet, um den Feldnamen in Gson zu konvertieren. Sie können den Namen jedoch auch in JSON bestimmen, indem Sie einfach die Mitgliedsvariablen der zu konvertierenden Klasse mit Anmerkungen versehen. Dies ist praktisch, wenn nur wenige Klassen konvertiert werden müssen.

ExampleBean.java


public class ExampleBean {
    @SerializedName("firstField")
    private String _firstField = "value";

    @SerializedName("secondField")
    private String _secondField = "vaule";
}

Referenz-URL

In Verbindung stehender Artikel

Erstellen Sie eine Instanz

Vereinfachen Sie die Schnittstelle

Überlasse es einer anderen Klasse

[^ 1]: Die Gson-Klasse wird als endgültig deklariert und kann nicht vererbt werden. Angenommen, Sie sind der Designer von Gson, überlegen Sie gerade, welche Art von Design Sie erstellen sollten. [^ 2]: ["Entwurfsmuster für die Wiederverwendung in der Objektorientierung"](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8 % E3% 82% A7% E3% 82% AF% E3% 83% 88% E6% 8C% 87% E5% 90% 91% E3% 81% AB% E3% 81% 8A% E3% 81% 91% E3 % 82% 8B% E5% 86% 8D% E5% 88% A9% E7% 94% A8% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83 % 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3-% E3% 82% AC% E3% 83% B3% E3% 83% 9E-% E3% 82% A8% E3% 83% AA% E3% 83% 83% E3% 82% AF / dp / 479731126 / ref = sr_1_1? Ie = UTF8 & qid = 1495503419 & sr = 8-1 & keywords =% E3% 82% AA% E3% 83% 96% E3% 82% B8% E3% 82% A7% E3% 82% AF% E3% 83% 88% E6% 8C% 87% E5% 90% 91% E3% 81% AB% E3% 81% 8A% E3% 81% 91% E3% 82% 8B% E5% 86% 8D% E5% 88% A9% E7% 94% A8% E3% 81% AE% E3% 81% 9F% E3% 82% 81% E3% 81% AE% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% Von 91% E3% 82% BF% E3% 83% BC% E3% 83% B3)

Recommended Posts

Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Strategiemuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Builder-Muster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Adaptermuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Muster der Vorlagenmethode
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fassadenmuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Abstract Factory-Muster
Mit Java & PHP erlernte Entwurfsmuster (Zusammenfassung)
Strategie zur Monetarisierung mit Python Java
Docker. Setzen Sie häufig verwendete Befehle auf den Alias "mit Erklärung".
[Von Zeit zu Zeit aktualisiert] Zusammenfassung der Entwurfsmuster in Java
Zusammenfassung von Kapitel 2 der Einführung in Entwurfsmuster, die in Java gelernt wurden
Kapitel 4 Zusammenfassung der Einführung in Entwurfsmuster, die in Java gelernt wurden
Zusammenfassung von Kapitel 3 der Einführung in Entwurfsmuster, die in Java gelernt wurden