Einführung in die Entwurfsmuster von [GoF](https://ja.wikipedia.org/wiki/Gang of for _ (Information Engineering)) ["Einführung in Entwurfsmuster, die in der erweiterten und überarbeiteten Java-Sprache gelernt wurden"]( https://www.amazon.co.jp/ Ergänzende überarbeitete Ausgabe Einführung in in Java gelernte Entwurfsmuster-Yuki-Hiroshi / dp / 4797327030 / ref = pd_lpo_sbs_14_t_0? _ Encoding = UTF8 & psc = 1 & refRID = 2ZE4GPYNN55JGR Ich werde über zusammenfassen.
Übersetzt ins Japanische bedeutet es "Vorderseite (des Gebäudes)". Wenn Sie ein Programm verwenden, das mehrere Klassen umfasst, müssen Sie die Methoden jeder Klasse in der richtigen Reihenfolge ausführen. Beispiel: "Wenn Sie Prozess X ausführen möchten, rufen Sie die B-Methode der A-Klasse, dann die D- und E-Methoden der C-Klasse und schließlich die G-Methode der F-Klasse auf." Im obigen Beispiel gab es nicht so viele Klassen und Methoden, aber je höher die Anzahl, desto komplexer ist die Steuerung von Klassen und Methoden bei der ** Verarbeitung. ** ** ** In einem solchen Fall wird das Muster **, das eine Schnittstelle (API) bereitstellt, die als "Fenster" dient, wenn es vom Verarbeitungsanforderer betrachtet wird, als ** Fassadenmuster ** bezeichnet. Durch Anwenden dieses Musters muss der Anforderer die Steuerung der komplizierten Verarbeitung nicht kennen.
Das Fassadenmuster wird von den Klassen verwendet, die im folgenden Klassendiagramm angezeigt werden.
Facade Es ist eine Klasse, die die Klassen für die Verarbeitung zusammenstellt und als ** Kontaktstelle für den Client ** dient. Es gibt keine besonderen Einschränkungen für den zu implementierenden Inhalt und es gibt keine schwierigen Punkte.
** Andere Klassen ** Dies sind die Klassen, die für die Verarbeitung aufgerufen werden. Es gibt keine besonderen Einschränkungen hinsichtlich der Implementierung. Es gibt nichts besonders Schwieriges, aber der Punkt ist, dass die verwendeten Klassen die Fassade, die der Kontaktpunkt ist, nicht kennen. Dies liegt daran, dass andere Klassen Facade nicht aufrufen.
Client Eine Klasse, die Facade nennt. Es gibt keine besonderen Einschränkungen für den zu implementierenden Inhalt und es gibt keine schwierigen Punkte.
Als konkretes Beispiel werden wir anhand der folgenden Klasse erklären.
ListFacade.java
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
public class ListFacade {
private ListFacade() { //Private Deklaration zur Verhinderung der Instanziierung mit neuen
}
public static void makeMemberList(String inputFileName, String outputFileName) {
try {
Properties memberProperties = MemberList.getProperties(inputFileName);
outputFileName = "C:\\work\\Facade\\src\\" + outputFileName + ".txt";
TxtWriter writer = new TxtWriter(new FileWriter(outputFileName));
Map<String, String> propertiesMap = writer.toMap(memberProperties);
writer.writeHeader();
writer.writeContents(propertiesMap);
writer.writeFooter();
writer.close();
System.out.println(String.format("Geben Sie die Datei aus. Dateiname:%s", outputFileName));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Die "ListFacade" -Klasse ist der Kontaktpunkt für die "Main" -Klasse, bei der es sich um den Client handelt.
Sie können sehen, dass nur die statis-Methode makeMemberList
definiert ist. Sie empfängt eine Eigenschaft von der MemberList
-Klasse, empfängt eine Map basierend auf dieser Eigenschaft und gibt sie in eine Datei aus.
Wenn der Vorgang erfolgreich ist, wird eine Meldung an die Konsole ausgegeben, die angibt, dass die Datei ausgegeben wurde.
Der einzige Punkt ist, dass ** der Ablauf dieser Prozesse in der Klasse "ListFacade" beschrieben wird, die der Kontaktpunkt ist, nicht in der Klasse "Main" **.
Lernmuster sind nicht besonders schwierig.
MemberList.java
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
public class MemberList {
private MemberList() { //Private Deklaration zur Verhinderung der Instanziierung mit neuen
}
public static Properties getProperties(String fileName) { //Eigenschaften vom Dateinamen abrufen
fileName = "C:\\work\\Facade\\src\\" + fileName + ".txt";
Properties properties = new Properties();
try {
properties.load(new FileInputStream(fileName));
} catch (IOException e) {
System.out.println(String.format("Fehler beim Lesen der Datei. Dateiname:%s", fileName));
}
return properties;
}
}
Dies ist die erste von zwei anderen Klassen. Es wird nur die statische Methode "getProperties" definiert, die die Eigenschaftendatei durch Empfang des Dateinamens zurückgibt. Es gibt nichts besonders Schwieriges.
TxtWriter.java
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
public class TxtWriter {
private Writer writer;
public TxtWriter(Writer writer) { //Konstrukteur
this.writer = writer;
}
//Immobilienwert erhalten(Schlüssel)Speichert mehr als 25 in Map
public Map<String, String> toMap(Properties properties) {
Map<String, String> propertiesMap = new HashMap<>();
for (Entry<Object, Object> e : properties.entrySet()) {
if (Integer.parseInt((String) e.getValue()) > 25) {
propertiesMap.put(e.getKey().toString(), e.getValue().toString());
}
}
return propertiesMap;
}
//Kopfzeile ausgeben
public void writeHeader() throws IOException {
writer.write("***************Header***************");
writer.write(System.lineSeparator());
}
//Inhalt ausgeben
public void writeContents(Map<String, String> propertiesMap) throws IOException {
writer.write("Die folgenden Mitglieder sind über 25 Jahre alt.");
writer.write(System.lineSeparator());
for (Entry<String, String> e : propertiesMap.entrySet()) {
writer.write("·Name:" + e.getKey() + "Alter:" + e.getValue());
writer.write(System.lineSeparator());
}
}
//Fußzeile ausgeben
public void writeFooter() throws IOException {
writer.write("***************Footer***************");
}
//schließen
public void close() throws IOException {
writer.close();
}
}
Dies ist die zweite der anderen Klassen. Einige Methoden sind definiert, z. B. eine Methode, die Eigenschaften empfängt und in Map speichert, und eine Methode, die sie in eine Textdatei ausgibt. Dies ist jedoch nicht besonders schwierig.
memberList.txt
#name=age
Tanaka_Tarou=25
Hoge_Hogeko=10
Yamada_Hanako=30
Neko_Nekota=50
Foo_Footarou=80
Dies ist die Textdatei, die von der MemberList-Klasse gelesen werden soll. Der Schlüssel ist der Name und der Wert ist das Alter.
-** Hauptklasse **
Main.java
import java.io.FileWriter;
import java.io.IOException;
import java.util.Map;
import java.util.Properties;
public class Main {
public static void main(String[] args) {
// 1.Beim Anwenden des Fassadenmusters
ListFacade.makeMemberList("memberList", "outputFile1");
// 2.Wenn das Fassadenmuster nicht angewendet wird
try {
String inputFileName = "memberList";
String outputFileName = "outputFile2";
Properties memberProperties = MemberList.getProperties(inputFileName);
outputFileName = "C:\\work\\Facade\\src\\" + outputFileName + ".txt";
TxtWriter writer = new TxtWriter(new FileWriter(outputFileName));
Map<String, String> propertiesMap = writer.toMap(memberProperties);
writer.writeHeader();
writer.writeContents(propertiesMap);
writer.writeFooter();
writer.close();
System.out.println(String.format("Geben Sie die Datei aus. Dateiname:%s", outputFileName));
} catch (IOException e) {
e.printStackTrace();
}
}
}
** 1. Wenn das Fassadenmuster angewendet wird **, können Sie die gewünschte Verarbeitung ausführen, indem Sie einfach die statische Methode makeMemberList
für die KlasseListFacade
aufrufen, die der Kontaktpunkt ist.
Wenn Sie den Vorgang mehrmals ausführen möchten, können Sie die Methode auch auf dieselbe Weise aufrufen. ,
** 2. Wenn das Fassadenmuster nicht angewendet wird ** Im Fall von ** kann die Zielverarbeitung nur ausgeführt werden, wenn die in der Klasse "ListFacade" beschriebenen Inhalte so beschrieben werden, wie sie sind.
Wenn Sie die Verarbeitung mehrmals ausführen möchten, müssen Sie so viele komplizierte Prozesse beschreiben, wie Sie ausführen möchten.
(*** Dieses Mal werden andere Klassen aus der Hauptklasse verwendet, aber es ist möglich, dass Sie andere Klassen nur aus dem Fenster heraus verwenden können, indem Sie protected angeben, indem Sie das Paket teilen **. Um den Unterschied zwischen der Verwendung von Facade und der Nichtverwendung von Facade leichter verständlich zu machen, kann hier auch vom Client aus aufgerufen werden. )
Das Ergebnis der Ausführung von "Main.java" ist wie folgt. Sie können sehen, dass es keinen Unterschied in den Verarbeitungsergebnissen gibt, wann das Muster angewendet wird und wann es nicht angewendet wird.
Ausführungsergebnis(Konsole)
Geben Sie die Datei aus. Dateiname:C:\work\Facade\src\outputFile1.txt
Geben Sie die Datei aus. Dateiname:C:\work\Facade\src\outputFile2.txt
Ausführungsergebnis(outputFile1.txt)
***************Header***************
Die folgenden Mitglieder sind über 25 Jahre alt.
・ Name: Yamada_Hanako Alter: 30 Jahre
・ Name: Foo_Footarou Alter: 80 Jahre
・ Name: Neko_Nekota Alter: 50
***************Footer***************
Ausführungsergebnis(outputFile2.txt)
***************Header***************
Die folgenden Mitglieder sind über 25 Jahre alt.
・ Name: Yamada_Hanako Alter: 30 Jahre
・ Name: Foo_Footarou Alter: 80 Jahre
・ Name: Neko_Nekota Alter: 50
***************Footer***************
Die Vorteile des Fassadenmusters sind wie folgt. ** 1. ** Der Code kann vereinfacht werden, da der Anrufer keine detaillierten Steuerelemente schreiben muss. ** 2. ** Sie können verhindern, dass unbeabsichtigte Anrufe zu Fehlern werden. ** 3. ** Durch Eingrenzen des Anrufports der Schnittstelle kann diese lose mit der Außenseite gekoppelt werden, und die Wiederverwendbarkeit wird verbessert.
Sie haben das Fassadenmuster kennengelernt, das ein Fenster zur Steuerung komplexer Prozesse bietet. Der Beispielcode wird unten hochgeladen. Wenn Sie möchten, lesen Sie ihn bitte.
Darüber hinaus sind unten weitere Entwurfsmuster zusammengefasst. Bitte beziehen Sie sich auch auf diese.
Recommended Posts