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.
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.
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.
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.
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.
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
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.)!
[^ 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