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

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 schauen wir uns ab und zu das schöne Design genauer an, das als eine Art Kunst bezeichnet werden kann.

Diese Kunst

import org.apache.http.client.fluent.Request;
import java.io.IOException;
...

String html = null;
try {
    html = Request.Get("http://www.qualysite.co.jp/")
        .connectTimeout(1000)
        .socketTimeout(1000)
        .execute()
        .returnContent()
        .asString();
} catch (IOException e) {
  ...
}

Es ist eine Szene, um die Quelle (HTML) der durch das Argument angegebenen URL abzurufen, aber wenn ich sie erneut betrachte, bin ich fasziniert von der Schönheit der Schnittstelle, die intuitiv übertragen wird.

Anerkennungspunkte

Es ist einfach, die fließende Oberfläche zu betrachten, aber die Designer sagen: "Es ist so eine Dekoration. Großartige Leute verstehen es nicht [^ 1]." Der Punkt der Wertschätzung ist hier die funktionale Schönheit, die die HTTP-Verbindungsroutine, die viele Schritte umfasst, auf leicht verständliche und einfache Weise zusammenfasst. Lass es uns unten gemeinsam genießen.

Wenn Sie das Fassadenmuster nicht verwenden

Der Code am Anfang ist ein Beispiel für die Verwendung des bekanntesten HTTP-Clients von Java Apache HttpComponents HttpClient. In der 2013 veröffentlichten Version 4.3 wurde eine Schnittstelle wie die am Anfang dieser Bibliothek hinzugefügt.

Zuvor mussten Sie Schritt-für-Schritt-Code schreiben, um das gleiche Ergebnis zu erzielen:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
...

String html = null;

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet("http://www.qualysite.co.jp/");

//Einstellungen anfordern
RequestConfig requestConfig = RequestConfig.custom()
    .setSocketTimeout(1000)
    .setConnectTimeout(1000)
    .build();
httpGet.setConfig(requestConfig);

CloseableHttpResponse response = null;
try {
  response = httpClient.execute(httpGet);

  //Inhaltserfassung(Entitätsobjekt enthält Inhalt)
  HttpEntity entity = response.getEntity();

  //Quelle aus dem Inhalt abrufen
  html = EntityUtils.toString(entity, StandardCharsets.UTF_8);

  //Entitätsverbrauch
  EntityUtils.consume(entity);
} catch(IOException e) {
  ...
} finally {
  try {
    if (response != null) {
      //Antwort schließen
      response.close();
    }
  } catch (IOException e) {
    ...
  }
}

Die Codierung ist ein oberflächliches Problem mit einem solchen Code. Das eigentliche Problem ist, dass es leicht ist, beim Schreiben von Code Fehler zu machen. Es ist ein Fehler, ** vom Anfang bis zum Ende einer HTTP-Verbindung mehrere Schritte nacheinander ausführen zu müssen ** und ** es ist schwer zu sagen, welchen Schritt Sie ausführen müssen ** Es wird die Ursache sein.

Speziell,

//Entitätsverbrauch
EntityUtils.consume(entity); //Schließt InputStream intern

Oder

//Antwort schließen
response.close(); //Schließt intern die HTTP-Verbindung

Verursacht beim Erstellen oder Ausführen keinen Fehler. Wenn Sie also nicht verstehen, wie es erstellt wurde, vergessen Sie leicht, es zu schreiben. Es ist nicht üblich zu sagen, dass "Entität verbraucht werden muss" oder "Antwort muss geschlossen sein". Dieses Vergessen des Schreibens führt zu einem Ressourcenleck.

Da CloseableHttpClient die Closeable-Schnittstelle implementiert, ist es auch möglich , httpClient.close (); zu schreiben. Ist es in Ordnung, die Methode, die HttpClient schließt, nicht so aufzurufen? Es wird nicht in Offizielle Beispielquelle aufgerufen, daher halte ich es für unnötig, aber ich mache mir Sorgen.

HttpClient bietet viele Funktionen auf niedriger Ebene und wird in vielen Bibliotheken verwendet, aber es ist nicht schön, diesen Code zu verwenden, da dies in Fällen der Fall ist, in denen dies nicht erforderlich ist.

Bei Verwendung des Fassadenmusters

Der Code am Anfang verwendet das Fassadenmuster. Lassen Sie uns noch einmal einen Blick mit Kommentaren werfen.

import org.apache.http.client.fluent.Request;
import java.io.IOException;
...

String html = null;
try {
  html = Request.Get("http://www.qualysite.co.jp/")
    .connectTimeout(1000) //Einstellungen anfordern
    .socketTimeout(1000)  //Einstellungen anfordern
    .execute()
    .returnContent()      //Inhaltserfassung->Antwort schließen->Entitätsverbrauch
    .asString();          //Quelle aus dem Inhalt abrufen
} catch (IOException e) {
  ...
}

Bemerkenswert ist die Methode "Response # returnContent". Bei dieser einen Methode muss die Inhaltserfassung-> Antwort schließen-> Entitätsverbrauch, bei der mehrere Objekte verwendet werden, ** in der Reihenfolge **, ** gemeinsam ** ausgeführt werden. Kann verarbeitet werden.

Diese Methode macht drei Dinge, aber der Punkt ist, dass der Name der Methode "returnContent" ist. Der Klassendesigner wollte wahrscheinlich nicht, dass der Klassenbenutzer über den Prozess des Schließens von Antworten und des Entitätsverbrauchs informiert ist. Weil es nicht in der Methode enthalten ist. Wenn Sie sich jedoch weiter vorstellen, scheint die versteckte Meldung "Es wird nicht nur ein Verweis auf das Inhaltsobjekt zurückgegeben" angezeigt, in der "returnContent" anstelle von "getContent" steht.

Fassade bedeutet "vor dem Gebäude". Der Zweck des Fassadenmusters besteht darin, dem Benutzer nur die Vorderseite des Gebäudes zu zeigen, dh die überfüllten Schnittstellen mehrerer Klassen zusammenzuführen und auf ein Minimum zu beschränken. Kein Wunder, dass ich das Interface für elegant hielt, aber es war die vom Designer gemessene Schönheit.

Expertenmeinungen zum Fassadenmuster

Viele Experten haben auch das Fassadenmuster kommentiert. (Ich habe es fett hervorgehoben.)

Hiroshi Yuki

Ein Programmierer kann "gut" sagen: "Oh, rufen Sie mich an, bevor Sie diese Klasse aufrufen. Sie müssen sich bei dieser Klasse registrieren, bevor Sie diese Methode aufrufen." Wenn wir mit sprechen, deutet dies darauf hin, dass wir die Fassadenrolle einführen müssen. ["Einführung in in Java-Sprache erlernte Entwurfsmuster"](https://www.amazon.co.jp/ In Java erlernte einführende Entwurfsmuster-Yuki-Hiroshi / dp / 4797327030 /)

lang_and_engine

** Wenn Sie mehrere Klassen aufrufen **, sammeln Sie diese standardmäßig in einer Methode, damit Sie sich nicht an die Reihenfolge des Aufrufs erinnern müssen. Die Methode ist sozusagen ein Verfahrenshandbuch für die Verwendung mehrerer Klassen. Aus Liste der 23 GoF-Entwurfsmuster für die Verwendung in Java

Schließlich

Es ist das wahre Vergnügen eines Programmierers, intellektuellen Genuss genießen zu können, indem er nur eine einzige Codezeile betrachtet, ohne ins Museum gehen zu müssen.

Wenn Sie ein Ingenieur sind, der mit der Kunst des Fassadenmusters sympathisiert, wenden Sie sich bitte an unsere Rekrutierungsmitarbeiter (Qualysite Technologies Co., Ltd.)!

In Verbindung stehender Artikel

Erstellen Sie eine Instanz

Vereinfachen Sie die Schnittstelle

Überlasse es einer anderen Klasse

Referenz-URL

[^ 1]: Eines der Zitate in Mobile Suit Gundam. Auf die Frage von Char, dass Ziong keine Beine habe, antwortete der Mechaniker: "Es ist so eine Dekoration. Großartige Leute wissen es nicht." ([Ziong](ttps: //ja.wikipedia.org/wiki/Ziong) - Wikipedia)

Recommended Posts

Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Fassadenmuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Abstract Factory-Muster
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 - Strategiemuster
Entwerfen Sie Muster für häufig verwendete Java-Bibliotheken - Muster der Vorlagenmethode
Mit Java & PHP erlernte Entwurfsmuster (Zusammenfassung)
Lernen Sie das Designmuster "Facade" mit Python
Entwurfsmuster #Facade
Fassadenmuster in Java
Docker. Setzen Sie häufig verwendete Befehle auf den Alias "mit Erklärung".
[Von Zeit zu Zeit aktualisiert] Zusammenfassung der Entwurfsmuster in Java
Lassen Sie uns mit TDD ~ Design pattern ~ etwas entwickeln, das dem Integrierten nahe kommt
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
Grobe Zusammenfassung des GoF-Java-Entwurfsmusters