[GO] Proxy-Muster in Java

Einführung

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.

Proxy-Muster

Was ist Proxy?

Ü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.

Charakter

Das Proxy-Muster wird von den Klassen verwendet, die im folgenden Klassendiagramm angezeigt werden. image.png

Abstrakte Klasse / Schnittstelle

Implementierungsklasse

Konkretes Beispiel

Als konkretes Beispiel werden wir anhand der folgenden Klasse erklären. image.png

Schnittstelle

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.

Implementierungsklasse

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.

Ausführungsklasse

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.

Ausführungsergebnis

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.

verdienen

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.

Zusammenfassung

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.

Verweise

Recommended Posts

Proxy-Muster in Java
Singleton-Muster in Java
Fliegengewichtsmuster in Java
Beobachtermuster in Java
Dekorationsmuster in Java
Prototypmuster in Java
Muster der Vorlagenmethode in Java
Muster der Verantwortungskette in Java
Lernen Sie das Entwurfsmuster "Proxy" in Python
Singleton-Muster in Python
Linux-Berechtigungen für Java
Verwenden Sie DataFrame in Java
Besuchermuster in Python
Pip-Installation in einer Proxy-Umgebung
Implementieren Sie einen tabellengesteuerten Test in Java
Signale in Java erkennen und verarbeiten.
Implementieren Sie das Singleton-Muster in Python
Implementierte Blasensortierung in Java (BubbleSort)
Grobe Zusammenfassung des GoF-Java-Entwurfsmusters
Überlappende reguläre Ausdrücke in Python und Java
Lernen Sie das Entwurfsmuster "Prototype" mit Python
Lernen Sie das Designmuster "Flyweight" in Python
Lernen Sie das Entwurfsmuster "Memento" mit Python
Express Python-Ertrag in JavaScript oder Java
Wenden Sie den Google Java Style-Formatierer mit IntelliJ an
Lernen Sie das Entwurfsmuster "Befehl" in Python
Erhalten Sie E-Mails mithilfe der Google Mail-API in Java
Lernen Sie das Entwurfsmuster "Besucher" mit Python
Lernen Sie das Entwurfsmuster "Mediator" mit Python
Lernen Sie das Designmuster "Decorator" mit Python
Lernen Sie das Entwurfsmuster "Iterator" mit Python
Lernen Sie das Entwurfsmuster "Strategie" mit Python
Lernen Sie das Entwurfsmuster "State" in Python
Lassen Sie uns das Bash-Skript in Java ausführen
Lernen Sie das Entwurfsmuster "Adapter" mit Python
[Viererbande] Designmuster lernen --Proxy