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.
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.
Le modèle Proxy est utilisé par les classes qui apparaissent dans le diagramme de classes ci-dessous.
Proxy
et la classe RealSubject
de la même manière du point de vue de la classe Client
.
L'implémentation se fait dans les sous-classes de la classe «Proxy» et de la classe «RealSubject».Proxy
Une classe qui agit comme un ** substitut ** de la classe RealSubject
.
Il fait tout ce qu'il peut à la demande de la classe Client
et crée une instance de la classe RealSubject
quand cela est vraiment nécessaire.
Il implémente également la classe / interface Subject
et a la classe RealSubject
comme champ.
RealSubject
C'est une classe qui sera ** la personne elle-même **.
Généré lorsque la classe Proxy
ne peut pas gérer la requête. Il implémente également la classe / interface Subject
de la même manière que la classe Proxy
.
Client
Une classe qui utilise la classe RealSubject
via la classe Proxy
.
À titre d'exemple concret, nous expliquerons en nous basant sur la classe suivante.
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.
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.
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.
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é.
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.
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.
Recommended Posts