[JAVA] Anwendungsbeispiel für Entwurfsmuster (Nr. 1)

zunaechst

** "Es ist einfach, einfache Dinge kompliziert zu machen, aber es ist schwierig, komplizierte Dinge einfach zu machen" ** ist meine Theorie.

Wenn wir vor Ort eine Aufgabe erhalten, sehen wir oft Programmierer, die versuchen, Probleme zu lösen, indem sie den Code aneinanderreihen, ohne zu viel nachzudenken. Immer wieder wird der Quellcode immer komplexer, unlesbarer und nicht mehr wartbar.

Es ist eine gute Idee, den Mechanismus und den Algorithmus so weit wie möglich zu berücksichtigen, bevor Sie beginnen. Dies lässt nicht nur Probleme, die kompliziert (in einigen Fällen dramatisch) aussehen, einfach aussehen, sondern bringt auch andere Vorteile mit sich, wie z. B. eine verbesserte Wiederverwendbarkeit und eine erhöhte Produktivität.

Entwurfsmuster sind in diesem Fall häufig nützlich. Bei der Funktionsimplementierung allgemeiner Geschäftssysteme werden die meisten allgemeinen Funktionen durch das Framework und die gemeinsame Bibliothek abgedeckt, sodass es nur wenige Gelegenheiten gibt, Entwurfsmuster zu verwenden. Es wird jedoch häufig in den Frameworks und allgemeinen Bibliotheken verwendet, auf denen es basiert. Viele von Ihnen kennen vielleicht die folgenden Muster, aber sie werden häufig verwendet.

Aufgabe

Dies ist ein Beispiel für die Produktentwicklung. Wenn Sie jedoch Kenntnisse über Entwurfsmuster haben, versuchen Sie bitte, die folgenden Probleme zu lösen.

Heutzutage ist es übertrieben zu sagen, dass die Entwicklung von Geschäftssystemen für die Verwendung von OSS-Bibliotheken im Gegensatz zu früher unvermeidlich ist. Apropos OSS-Bibliotheken, einige sind wichtig und andere nicht gut bekannt. Egal was passiert, es wird aufgrund der Entwicklung der Zeit aktualisiert oder beseitigt. In diesem Fall gibt es Entwurfsmuster, die wir häufig verwenden, um so weit wie möglich nicht von Änderungen in der Bibliothek betroffen zu sein.

Das Problem: Die Java-Entwicklung verwendet JSON-OSS-Bibliotheken wie GSON und Jackson für die gegenseitige Konvertierung zwischen Data Beans und JSON-Zeichenfolgen. Angenommen, Sie könnten diese Bibliothek in Zukunft durch eine andere ersetzen. Wie sollte das Entwurfsmuster angewendet werden, um die Auswirkungen auf vorhandene Quellen zu minimieren, wenn die Version der verwendeten Bibliothek aktualisiert oder durch eine andere Bibliothek ersetzt wird? Denken Sie hier darüber nach, bevor Sie sich die zweite Hälfte des Artikels ansehen.

Lösungsbeispiel

Wir lösen dieses Problem, indem wir das Adaptermuster des Entwurfsmusters verwenden. Dies ist nicht die einzige Lösung. Wenn Sie weitere Kommentare haben, kommentieren Sie diese bitte. Wenn Sie die Details des Adaptermusters erfahren möchten, lesen Sie bitte Apater-Muster | TECK SCORE.

Bei Verwendung des Adaptermusters gibt es die folgenden zwei Arten von Montagemethoden.

Es bestand die Anforderung, dass es in Zukunft durch eine andere Bibliothek ersetzt werden könnte, sodass die Verwendung der Vererbung größere Auswirkungen auf vorhandene Quellen hat. Hier wird "Implementierung mittels Delegation" übernommen.

Implementierungsbeispiel

Unten finden Sie eine Beispielimplementierung. (Für den Artikel vereinfacht.) Selbst wenn Sie es in Zukunft durch eine andere Bibliothek ersetzen, sollte die Implementierung auf der Benutzerseite nahezu unverändert damit umgehen können.

Zielschnittstelle

package json;

import java.io.InputStream;
import java.io.OutputStream;

/**
 *
 *JSON-Zielschnittstelle
 *
 */
public interface JsonAdapterIF {

    /**
     *Zielmethode(JSON-Zeichenfolge lesen)
     */
    <T> T read(String json, Class<T> type) throws Exception;

    /**
     *Zielmethode(Lesen Sie den JSON-Eingabestream)
     */
    <T> T read(InputStream is, Class<T> type) throws Exception;

    /**
     *Zielmethode(In JSON-Zeichenfolge schreiben)
     */
    String write(Object obj) throws Exception;

    /**
     *Zielmethode(Schreiben Sie in den JSON-Ausgabestream)
     */
    void write(Object obj, OutputStream os) throws Exception;

}

Adapter

package json;

import java.io.InputStream;
import java.io.OutputStream;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 *JSON-Adapterklasse(Jackson)。
 */
public class JacksonAdapter implements JsonAdapterIF {

    /** Adaptee (Jacksons ObjectMapper) */
    private ObjectMapper om;

    /**
     *Geschützt, sodass Sie keine Adapterinstanz direkt von der Benutzerseite aus erstellen können
     *Der Konstruktor wird von einem Modifikator ausgeblendet.
     */
    protected JacksonAdapter() {
        this(new ObjectMapper());
    }

    /**
     *Geschützt, sodass Sie keine Adapterinstanz direkt von der Benutzerseite aus erstellen können
     *Der Konstruktor wird von einem Modifikator ausgeblendet.
     */
    protected JacksonAdapter(ObjectMapper om) {
        // the om must not be null
        assert om != null;
        this.om = om;
    }

    @Override
    public <T> T read(String json, Class<T> type) throws Exception {
        return om.readValue(json, type);
    }

    @Override
    public <T> T read(InputStream is, Class<T> type) throws Exception {
        return om.readValue(is, type);
    }

    @Override
    public String write(Object obj) throws Exception {
        return om.writeValueAsString(obj);
    }

    @Override
    public void write(Object obj, OutputStream os) throws Exception {
        om.writeValue(os, obj);
    }

}

Fabrik (Bonus)

package json;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 *Factory-Klasse zum Erstellen eines JSON-Adapters.
 *Da es nicht möglich ist, eine Instanz des Adapters direkt auf der Clientseite zu erstellen, wird eine Factory bereitgestellt.
 */
public class JsonAdapterFactory {

    /** A thread safe map of JsonAdapter */
    private static Map<Class<?>, JsonAdapterIF> omMap = new ConcurrentHashMap<>();

    static {
        //Standard-JSON-Adapter (für jede Klasse)
        omMap.put(Object.class, new JacksonAdapter());

        //Erstellen Sie einen weiteren ObjectMapper, wenn eine spezielle Initialisierung erforderlich ist
        ObjectMapper om = new ObjectMapper();
        //Abkürzung
        omMap.put(Spezielle Klasse.class, new JacksonAdapter(om));
    }

    private JsonAdapterFactory() {
    }

    /**
     *Holen Sie sich den Standard-JSON-Adapter.
     */
    public static JsonAdapterIF getJsonAdapter() {
        return omMap.get(Object.class);
    }

    /**
     *Beziehen eines JSON-Adapters für eine spezielle Klasse.
     */
    public static JsonAdapterIF getJsonAdapter(Class<?> clazz) {
        return omMap.get(clazz);
    }

}

Zhou @ Soft Sync

Recommended Posts

Anwendungsbeispiel für Entwurfsmuster (Nr. 1)
Entwurfsmuster ~ Verantwortungskette ~
Entwurfsmuster ~ Builder ~
Entwurfsmuster ~ Besucher ~
Java-Entwurfsmuster
Entwurfsmuster ~ Proxy ~
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Entwurfsmuster ~ Composite ~
Entwurfsmuster (1): AbstractFactory
Entwurfsmuster ~ Iterator ~
Entwurfsmuster ~ Fassade ~
Entwurfsmuster ~ Brücke ~
Entwurfsmuster ~ Dekorateur ~
Entwurfsmuster ~ Interpreter ~
Entwurfsmuster ~ Beobachter ~
Entwurfsmuster ~ Prototyp ~
Entwurfsmuster ~ Memento ~
Entwurfsmuster ~ Adapter ~
Entwurfsmuster ~ Fliegengewicht ~
Design / Codebeispiel für die Anzeige des Webanwendungsmenüs
PrintObserver "Observer Design Pattern: Beschreibung und Implementierungsbeispiel"
C ++ - Entwurfsmuster (TemplateMethod-Muster)
Entwurfsmuster ~ Fabrikmethode ~
Entwurfsmuster ~ Abstrakte Fabrik ~
[Nr. 006] Grobe Gestaltung des Organisationsverwaltungsbildschirms und der Anmeldung
Beispiel für die Verwendung von vue.config.js
Muster der Verantwortungskette
Zusammenfassung des GoF-Entwurfsmusters
Entwurfsmuster ~ Vorlagenmethode ~
Zusammenfassung des Java-Entwurfsmusters
Überdenken des Java8-Lambda-Ausdrucks- und Stream-Entwurfsmusters - Muster der Verantwortungskette -
Beispiel für Parameter mit where
Beispiel für die Verwendung einer abstrakten Klasse
[Entwurfsmuster] Java-Kernbibliothek
[Java] Zusammenfassung der Entwurfsmuster