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.
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";
}
//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.
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.
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.
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.
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.
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.
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.
GsonBuilder
setzt MyFieldNamingStrategy
auf Gson
MyFieldNamingStrategy # translateName
wird aufgerufen, wenn Feldnamen in Gson # toJson
übersetzt werdenDer 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").
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
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!
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";
}
[^ 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