Modèle de proxy en Java

introduction

Présentation des modèles de conception de [GoF](https://ja.wikipedia.org/wiki/Gang of for _ (Information Engineering)) ["Introduction aux modèles de conception appris dans le langage Java augmenté et révisé"]( https://www.amazon.co.jp/ Édition révisée supplémentaire Introduction aux modèles de conception appris en langage Java-Yuki-Hiroshi / dp / 4797327030 / ref = pd_lpo_sbs_14_t_0? _ Encoding = UTF8 & psc = 1 & refRID = 2ZE4GPYNN55JGDR5QMHP) Je vais résumer sur.

Modèle proxy

Qu'est-ce que le proxy

Traduit en japonais, cela signifie «proxy». ** Un modèle dans lequel une classe proxy effectue un traitement pour le compte de la classe du principal et génère la classe du principal lorsque le principal est vraiment nécessaire ** est appelé le ** modèle de proxy **. .. En appliquant ce modèle, vous pouvez résoudre le problème selon lequel le processus d'initialisation, qui prend beaucoup de temps pour générer votre propre classe, provoque un mécontentement de l'utilisateur.

Personnage

Le modèle Proxy est utilisé par les classes qui apparaissent dans le diagramme de classes ci-dessous. image.png

Classe / interface abstraite

Classe d'implémentation

Exemple concret

À titre d'exemple concret, nous expliquerons en nous basant sur la classe suivante. image.png

interface

Management.java


public interface Management {
	void setReviewProjectName(String projectName); 

	String getReviewProjectName();

	void printReviewResult();
}

L'interface Management définit une méthode pour définir / obtenir le projectName et afficher le résultat de la revue. Le traitement proprement dit est implémenté dans la classe Manager et la classe ManagerProxy décrites plus loin. Il n'y a rien de particulièrement difficile.

Classe d'implémentation

Manager.java


import java.util.Random;

public class Manager implements Management {
	private String projectName;

	public Manager() {
		this.projectName = "Cas sans titre";
		heavyJob("Créer une instance de Management et pendant Rv");
	}

	public Manager(String projectName) {
		this.projectName = projectName;
		heavyJob("Instance de gestion(" + projectName + ")Est généré et en Rv");
	}

	@Override
	public void setReviewProjectName(String projectName) {
		this.projectName = projectName;
	}

	@Override
	public String getReviewProjectName() {
		return projectName;
	}

	private void heavyJob(String msg) { // 1.Requis au moment de la génération(Réglage)Traitement lourd
		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 terminé.");
	}

	@Override
	public void printReviewResult() { // 2.Traitement pour trier et afficher le résultat de l'examen par nombre aléatoire
		System.out.println("----------Résultat RV----------");
		Random rnd = new Random();
		int ran = rnd.nextInt(10);
		if (ran < 5) {
			System.out.println(projectName + "A été rejeté.\n");
		} else if (ran > 5) {
			System.out.println(projectName + "A été approuvé.\n");
		}
	}

}

La classe Manager est la classe de la personne. Il fait quelque chose d'incontrôlable pour la classe de substitution ManegerProxy. Ici, printReviewResult correspond à ce processus. Les points sont les deux points suivants. ** 1. ** Il est nécessaire (paramètre) au moment de la génération dans le constructeur, mais il appelle la méthode heavyJob, qui est un processus long et lourd. ** 2. ** Remplacez printReviewResult et affichez le résultat de la révision.

Je vais donner une explication supplémentaire. Pour générer la classe Manager, vous devez exécuter la méthode heavyJob par défaut. Cependant, ce processus est lourd et prend du temps, c'est donc une bonne idée de générer la classe Manager jusqu'à ce que le processus ( printReviewResult) qui ne peut pas être géré par la classe ManegerProxy agissant en tant qu'agent soit appelé. Il n'y en a pas. Par conséquent, dans la classe ManegerProxy décrite plus loin, le processus d'acquisition et de définition du nom du projet uniquement ( getReviewProjectName, setReviewProjectName) est effectué par l'agent lui-même, et lorsque printReviewResult est appelé, le manegerProxy est lui-même. Générez et définissez la classe Maneger`.

ManagerProxy.java


public class ManagerProxy implements Management {
	private String projectName;
	private Manager real;

	public ManagerProxy() {
		this.projectName = "Cas sans titre";
	}

	public ManagerProxy(String projectName) {
		this.projectName = projectName;
	}

	@Override
	public synchronized void setReviewProjectName(String projectName) {
		// 1.Si le rôle de la personne est généré et défini, définissez le nom du projet pour le rôle de la personne.
		if (real != null) {
			real.setReviewProjectName(projectName);
		}
		// 1.Si le rôle principal n'est pas créé et défini, définissez le nom du projet comme rôle proxy.
		this.projectName = projectName;
	}

	@Override
	public String getReviewProjectName() {
		return projectName;
	}

	@Override
	public void printReviewResult() {
		realize();
		real.printReviewResult();
	}

	private synchronized void realize() {// 2.Générer / définir le rôle principal lorsque le rôle principal n'est pas généré / défini
		if (real == null) {
			real = new Manager(projectName);
		}
	}
}

La classe ManagerProxy est une classe qui agit comme un proxy pour la classe Manager. Les points sont les deux points suivants. ** 1. ** Remplacement de setReviewProjectName. ** 2. ** Après avoir appelé la méthode realise dans la méthode printReviewResult, la méthode printReviewResult de la personne en question est appelée.

J'expliquerai dans le supplément. Lorsque setReviewProjectName est appelé pour 1., si la classe Manager du rôle principal n'est pas définie / générée, définissez la valeur sur projectName du ManagerProxy qui est le rôle proxy. À ce stade, on peut dire que la classe Manager pour le rôle du mandant n'est pas générée et que le ManagerProxy pour le rôle de l'agent effectue le traitement à la place. Concernant 2., puisque la méthode printReviewResult est un processus qui ne peut pas être géré par le rôle proxy, elle est générée et définie lorsque la classe Manager du rôle principal n'est pas créée et définie.

Classe d'exécution

Client.java


public class Client {
	public static void main(String[] args) {
		Management m1 = new ManagerProxy("Une matière");
		System.out.println("Démarrez le projet Rv.");
		System.out.println("Le projet en Rv" + m1.getReviewProjectName() + "est.");
		m1.setReviewProjectName("B matière");
		System.out.println("Le projet en Rv" + m1.getReviewProjectName() + "est.");
		m1.printReviewResult();

		Management m2 = new ManagerProxy();
		System.out.println("Démarrez le projet Rv.");
		System.out.println("Le projet en Rv" + m2.getReviewProjectName() + "est.");
		m2.setReviewProjectName("C matière");
		System.out.println("Le projet en Rv" + m2.getReviewProjectName() + "est.");
		m2.printReviewResult();
	}
}

Une instance de la classe ManagerProxy est créée et l'acquisition du nom est définie. Après cela, en appelant la méthode printReviewResult, une instance de la classe Manager qui joue le rôle de la personne est créée et traitée.

Résultat d'exécution

Le résultat de l'exécution de Client.java est le suivant. Vous pouvez voir que le résultat Rv est généré aléatoirement par des nombres aléatoires après l'exécution d'un traitement intensif (heavyJob).

Résultat d'exécution


Démarrez le projet Rv.
Le projet dans Rv est un projet.
Le projet en Rv est un projet B.
Instance de gestion(B matière)Est généré, pendant Rv ... Rv terminé.
----------Résultat RV----------
Le cas B a été rejeté.

Démarrez le projet Rv.
Le projet dans Rv est un projet sans titre.
Le projet dans Rv est un projet C.
Instance de gestion(C matière)Est généré, pendant Rv ... Rv terminé.
----------Résultat RV----------
Le cas C a été approuvé.

mérite

Les avantages du modèle proxy sont les suivants. ** 1. ** Le temps requis pour l'initialisation peut être raccourci et la commodité de l'utilisateur peut être améliorée. ** 2. ** Des parties peuvent être faites en séparant le rôle d'agent et le rôle de mandant.

Résumé

J'ai découvert le modèle Proxy, qui permet à un agent, pas à vous, de faire le travail jusqu'à ce que vous en ayez vraiment besoin. L'exemple de code est téléchargé ci-dessous, veuillez donc vous y référer si vous le souhaitez.

En outre, d'autres modèles de conception sont résumés ci-dessous, veuillez donc vous y référer également.

Les références

Recommended Posts

Modèle de proxy en Java
Motif singleton en Java
Modèle de poids mouche en Java
Modèle d'observateur en Java
Modèle de décorateur en Java
Modèle de prototype en Java
Modèle de méthode de modèle en Java
Modèle de chaîne de responsabilité en Java
Apprenez le modèle de conception "Proxy" en Python
Motif singleton en Python
Autorisations Linux sur Java
Utiliser DataFrame en Java
Modèle de visiteur en Python
Installation de Pip dans un environnement proxy
Mettre en œuvre un test piloté par table en Java
Détectez et traitez les signaux en Java.
Implémenter le modèle Singleton en Python
Mise en œuvre du tri à bulles en Java (BubbleSort)
Résumé du modèle de conception Java GoF
Chevauchement d'expressions régulières en Python et Java
Apprenez le modèle de conception "Prototype" avec Python
Apprenez le modèle de conception "Flyweight" en Python
Apprenez le modèle de conception "Memento" avec Python
Rendement Python express en JavaScript ou Java
Appliquer le formateur Google Java Style avec IntelliJ
Apprenez le modèle de conception "Commande" en Python
Recevoir des e-mails à l'aide de l'API Gmail en Java
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
Apprenez le modèle de conception "Iterator" avec Python
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "État" en Python
Lançons le script Bash en Java
Apprenez le modèle de conception "Adapter" avec Python
[Gang of Four] Apprentissage des modèles de conception - Proxy