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/ Erweiterte und überarbeitete Ausgabe Einführung in Entwurfsmuster, die in der Java-Sprache gelernt wurden-Yuki-Hiroshi / dp / 4797327030 / ref = pd_lpo_sbs_14_t_0? _ Encoding = UTF8 & psc = 1 & refRID = 2ZE4GPYNN55JGDR5M Ich werde über zusammenfassen.
Übersetzt ins Japanische bedeutet es "Proxy". ** Ein Muster, in dem eine Ersatzklasse im Auftrag der Principal-Klasse eine Verarbeitung durchführt und die Principal-Klasse generiert, wenn der Principal wirklich benötigt wird **, wird als ** Proxy-Muster ** bezeichnet. .. Durch Anwenden dieses Musters können Sie das Problem lösen, dass der Initialisierungsprozess, der lange dauert, um Ihre eigene Klasse zu generieren, den Benutzer unzufrieden macht.
Das Proxy-Muster wird von den Klassen verwendet, die im folgenden Klassendiagramm angezeigt werden.
Proxy
Eine Klasse, die als ** Ersatz ** für die RealSubject
-Klasse fungiert.
Es tut so viel wie möglich für die Anforderung aus der Klasse "Client" und erstellt eine Instanz der Klasse "RealSubject", wenn sie wirklich benötigt wird.
Es implementiert auch die Klasse / Schnittstelle "Subject" und hat die Klasse "RealSubject" als Feld.
RealSubject Es ist eine Klasse, die ** die Person selbst ** sein wird. Wird generiert, wenn die Proxy-Klasse die Anforderung nicht verarbeiten kann. Es implementiert auch die Klasse / Schnittstelle "Betreff" auf die gleiche Weise wie die Klasse "Proxy".
Client Eine Klasse, die die RealSubject-Klasse über die Proxy-Klasse verwendet.
Als konkretes Beispiel werden wir anhand der folgenden Klasse erklären.
Management.java
public interface Management {
void setReviewProjectName(String projectName);
String getReviewProjectName();
void printReviewResult();
}
Die Management
-Schnittstelle definiert eine Methode zum Festlegen / Abrufen des Projektnamens und zum Anzeigen des Ergebnisses der Überprüfung.
Die eigentliche Verarbeitung wird in den später beschriebenen Klassen "Manager" und "ManagerProxy" implementiert.
Es gibt nichts besonders Schwieriges.
Manager.java
import java.util.Random;
public class Manager implements Management {
private String projectName;
public Manager() {
this.projectName = "Fall ohne Titel";
heavyJob("Erstellen Sie eine Instanz von Management und während Rv");
}
public Manager(String projectName) {
this.projectName = projectName;
heavyJob("Verwaltungsinstanz(" + projectName + ")Wird generiert und in Rv");
}
@Override
public void setReviewProjectName(String projectName) {
this.projectName = projectName;
}
@Override
public String getReviewProjectName() {
return projectName;
}
private void heavyJob(String msg) { // 1.Zur Generierungszeit erforderlich(Rahmen)Schwere Verarbeitung
System.out.print(msg);
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.print("・");
}
System.out.println("Rv abgeschlossen.");
}
@Override
public void printReviewResult() { // 2.Verarbeitung zum Sortieren und Ausgeben des Überprüfungsergebnisses nach Zufallszahlen
System.out.println("----------Rv Ergebnis----------");
Random rnd = new Random();
int ran = rnd.nextInt(10);
if (ran < 5) {
System.out.println(projectName + "Wurde abgelehnt.\n");
} else if (ran > 5) {
System.out.println(projectName + "Wurde genehmigt.\n");
}
}
}
Die Manager
Klasse ist die Klasse für die Person. Es macht etwas Unkontrollierbares für die Ersatzklasse "ManegerProxy".
Hier entspricht printReviewResult
diesem Prozess.
Die Punkte sind die folgenden zwei Punkte.
** 1. ** Es ist zum Zeitpunkt der Generierung im Konstruktor erforderlich (Einstellung), ruft jedoch die heavyJob
-Methode auf, was ein zeitaufwändiger und schwerer Prozess ist.
** 2. ** Überschreiben Sie printReviewResult
und zeigen Sie das Ergebnis der Überprüfung an.
Ich werde eine ergänzende Erklärung geben. Um die "Manager" -Klasse zu generieren, müssen Sie standardmäßig die "heavyJob" -Methode ausführen. Dieser Prozess ist jedoch schwer und zeitaufwändig. Daher empfiehlt es sich, die Klasse "Manager" zu generieren, bis der Prozess ("printReviewResult") aufgerufen wird, der von der als Agent agierenden Klasse "ManegerProxy" nicht verarbeitet werden kann. Da ist gar nichts. Daher wird in der später beschriebenen "ManegerProxy" -Klasse der Vorgang des Erfassens und Festlegens des Projektnamens ("getReviewProjectName", "setReviewProjectName") vom Agenten selbst ausgeführt, und wenn "printReviewResult" aufgerufen wird, ist "manegerProxy" er selbst. Generiere und setze die Maneger` Klasse.
ManagerProxy.java
public class ManagerProxy implements Management {
private String projectName;
private Manager real;
public ManagerProxy() {
this.projectName = "Fall ohne Titel";
}
public ManagerProxy(String projectName) {
this.projectName = projectName;
}
@Override
public synchronized void setReviewProjectName(String projectName) {
// 1.Wenn die Rolle der Person generiert und festgelegt wird, legen Sie den Projektnamen für die Rolle der Person fest.
if (real != null) {
real.setReviewProjectName(projectName);
}
// 1.Wenn die Hauptrolle nicht erstellt und festgelegt wurde, legen Sie den Projektnamen als Proxy-Rolle fest.
this.projectName = projectName;
}
@Override
public String getReviewProjectName() {
return projectName;
}
@Override
public void printReviewResult() {
realize();
real.printReviewResult();
}
private synchronized void realize() {// 2.Generieren / Festlegen der Rolle der Person, wenn die Rolle der Person nicht generiert / festgelegt wird
if (real == null) {
real = new Manager(projectName);
}
}
}
Die Klasse "ManagerProxy" ist eine Klasse, die als Proxy für die Klasse "Manager" fungiert.
Die Punkte sind die folgenden zwei Punkte.
** 1. ** Überschreiben von setReviewProjectName
.
** 2. ** Nach dem Aufruf der Methode "realisieren "in der Methode" printReviewResult "wird die Methode" printReviewResult "der betreffenden Person aufgerufen.
Ich werde in der Ergänzung erklären. Wenn "setReviewProjectName" für 1 aufgerufen wird, setzen Sie den Wert auf "projectName" der "ManagerProxy", die die Proxy-Rolle ist, wenn die "Manager" -Klasse der Hauptrolle nicht festgelegt / generiert ist. Zu diesem Zeitpunkt kann gesagt werden, dass die "Manager" -Klasse für die Hauptrolle nicht generiert wurde und der "ManagerProxy" für die Proxy-Rolle stattdessen die Verarbeitung durchführt. Da die Methode "printReviewResult" ein Prozess ist, der von der Agentenrolle nicht verarbeitet werden kann, wird sie generiert und festgelegt, wenn die "Manager" -Klasse der Hauptrolle nicht generiert und festgelegt wird.
Client.java
public class Client {
public static void main(String[] args) {
Management m1 = new ManagerProxy("Eine Angelegenheit");
System.out.println("Starten Sie das Projekt Rv.");
System.out.println("Das Projekt in Rv" + m1.getReviewProjectName() + "ist.");
m1.setReviewProjectName("B Materie");
System.out.println("Das Projekt in Rv" + m1.getReviewProjectName() + "ist.");
m1.printReviewResult();
Management m2 = new ManagerProxy();
System.out.println("Starten Sie das Projekt Rv.");
System.out.println("Das Projekt in Rv" + m2.getReviewProjectName() + "ist.");
m2.setReviewProjectName("C Angelegenheit");
System.out.println("Das Projekt in Rv" + m2.getReviewProjectName() + "ist.");
m2.printReviewResult();
}
}
Eine Instanz der Klasse "ManagerProxy" wird erstellt und die Erfassung des Namens festgelegt. Anschließend wird durch Aufrufen der Methode "printReviewResult" eine Instanz der Klasse "Manager" erstellt und verarbeitet, die die Rolle der Person spielt.
Das Ergebnis der Ausführung von "Client.java" ist wie folgt.
Sie können sehen, dass das Rv-Ergebnis zufällig durch Zufallszahlen ausgegeben wird, nachdem eine schwere Verarbeitung (heavyJob
) ausgeführt wurde.
Ausführungsergebnis
Starten Sie das Projekt Rv.
Das Projekt in Rv ist ein Projekt.
Das Projekt in Rv ist B-Projekt.
Verwaltungsinstanz(B Materie)Wird erzeugt, während Rv ... Rv abgeschlossen ist.
----------Rv Ergebnis----------
Fall B wurde abgelehnt.
Starten Sie das Projekt Rv.
Das Projekt in Rv ist ein Projekt ohne Titel.
Das Projekt in Rv ist C-Projekt.
Verwaltungsinstanz(C Angelegenheit)Wird erzeugt, während Rv ... Rv abgeschlossen ist.
----------Rv Ergebnis----------
Fall C wurde genehmigt.
Die Vorteile des Proxy-Musters sind wie folgt. ** 1. ** Die für die Initialisierung erforderliche Zeit kann verkürzt und der Benutzerkomfort verbessert werden. ** 2. ** Teile können hergestellt werden, indem die Rolle des Agenten und die Rolle des Auftraggebers getrennt werden.
Ich habe etwas über das Proxy-Muster gelernt, mit dem ein Agent, nicht Sie, die Arbeit erledigen kann, bis Sie sie wirklich brauchen. 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