La compréhension et l'utilisation de modèles de conception peuvent cultiver nos bonnes habitudes de programmation orientées objet, et dans les applications réelles, nous pouvons profiter du plaisir d'être à l'aise.
Le proxy est un modèle relativement utile, et il existe de nombreuses variantes. expliqué comme: Du point de départ à une couche intermédiaire entre les destinations, ce qui signifie agent.
Défini dans le modèle de conception: fournit un proxy pour d'autres objets pour contrôler l'accès à cet objet.
Pourquoi utiliser le mode proxy
1. Mécanisme d'autorisation Les utilisateurs de différents niveaux d'autorisation ont des droits d'accès différents au même objet. (utilisateurs non enregistrés), et dans Jive, cela vous permet de contrôler les droits d'accès de ces deux utilisateurs vers le forum via un proxy comme Forumproxy.
2. Un client ne peut pas fonctionner directement vers un objet, mais doit interagir avec cet objet.
Donnez deux exemples spécifiques:
1. Si cet objet est une grande image et qu'il faut beaucoup de temps pour l'afficher, alors lorsque l'image est incluse dans le document, utilisez l'éditeur ou le navigateur pour ouvrir le document et que le document doit être ouvert très rapidement et ne peut pas attendre .
2. Si cet objet est sur un serveur distant sur Internet et fonctionne directement, cet objet peut être lent en raison de la vitesse du réseau, nous pouvons utiliser le proxy pour remplacer cet objet d'abord.
En bref, le principe est que pour les objets avec des frais généraux élevés, ils ne sont créés que lorsque vous l'utilisez. Par conséquent, certaines personnes pensent que Java consomme la mémoire des ressources, et je pense que cela a quelque chose à voir avec l'idée de programmation.
Comment utiliser le mode proxy
Prenant l'exemple du système du forum Jive, il existe de nombreux types d'utilisateurs qui visitent le système de forum: utilisateurs ordinaires enregistrés, gestionnaires de forums, gestionnaires de systèmes et touristes. Ce n'est qu'en enregistrant un utilisateur ordinaire.
Le forum est l'interface centrale de Jive.
Les utilisateurs ayant différents niveaux d'autorisations sont définis dans les buts-buckrmissions:
La copie de code est la suivante:
La classe publique pour les buts-misessions implémente cacheable {
/ **
* Permission de lire l'objet.
* /
public static final int Read = 0;
/ **
* Permission d'administrer l'ensemble du système.
* /
public static final int system_admin = 1;
/ **
* Autorisation d'administrer un forum particulier.
* /
public static final int forum_admin = 2;
/ **
* Permission d'administrer un utilisateur particulier.
* /
public static final int user_admin = 3;
/ **
* Autorisation d'administrer un groupe particulier.
* /
public static final int groupe_admin = 4;
/ **
* Autorisation de modernate threads.
* /
public static final int moterate_threads = 5;
/ **
* Permission de créer un nouveau fil.
* /
public static final int créate_thread = 6;
/ **
* Permission de créer un nouveau message.
* /
public static final int Create_Message = 7;
/ **
* Permission aux messages modernes.
* /
public static final int moterate_messages = 8;
.....
public booléen issystemorforumadmin () {
return (valeurs [forum_admin] || valeurs [system_admin]);
}
.....
}
Par conséquent, diverses autorisations d'opération dans le forum sont liées au niveau de l'utilisateur défini par des bullentins. Par exemple, lors de la modification du nom du forum, seul le gestionnaire de forum ou le gestionnaire de systèmes peut le modifier, le code est le suivant:
La copie de code est la suivante:
classe publique Forumproxy implémente le forum {
Autorisations privées pour les bulleurs de butssions;
Forum du forum privé;
this.authorisation = autorisation;
Public Forumproxy (Forum Forum, autorisation d'autorisation,
Pour les autorisations de buts-missions) {
this.forum = forum;
this.authorisation = autorisation;
this.permissions = autorisation;
}
.....
public void setName (String Name) lève un autorizedException,
ForumalreadyExistSexception {
// Seul le système ou l'administrateur de forum peut modifier le nom if (permissions.issystemorforumadmin ()) {
forum.setName (nom);
}
autre {
lancer un nouveau UnauthorizedException ();
}
}
...
}
DBForum est la véritable implémentation du forum d'interface.
La copie de code est la suivante:
La classe publique DBForum implémente le forum, cacheable {
...
public void setName (String Name) lève ForumalReadyExistSException {
....
this.name = name;
// Ici, vous enregistrez vraiment le nouveau nom dans la base de données sur saveToDB ();
....
}
...
}
Chaque fois que l'événement de modification du nom du forum est impliqué, d'autres programmes doivent d'abord gérer Forumproxy.
Dans les applications quotidiennes, il est inévitable que le système d'autorisation ou de sécurité du système soit toujours impliqué.
Continuons à parler plus profondément en combinaison avec Jive, et le modèle d'usine sera impliqué ci-dessous.
Nous savons déjà que l'utilisation du forum nécessite l'utilisation de Forumproxy. Singleton est utilisé ici (également l'un des modèles de conception), GetInstance () renvoie ForumFactoryProxy.
Pourquoi ne pas renvoyer ForumFactory, mais retourner ForumFactory Implementation ForumFactoryProxy? La raison est évidente et il est nécessaire de déterminer si le forum a la permission de le créer par le proxy.
Dans ForumFactoryProxy, nous voyons le code comme suit:
La copie de code est la suivante:
classe publique ForumFactoryProxy étend ForumFactory {
Forumfactory Forumfactory protégée;
Autorisation d'autorisation protégée;
PROTÉCÉMENTS POUR LES PERMISSIONS DE PUBLIMES;
Public ForumFactoryProxy (autorisation d'autorisation, ForumFactory Factory, pour les autorisations de buts-mises) {
this.factory = usine;
this.authorisation = autorisation;
this.permissions = autorisation;
}
Public Forum CreateForum (nom de chaîne, description de la chaîne)
lance UnauthorizedException, ForumalreadyExistSException {
// Seuls les administrateurs système peuvent créer un forum
if (permissions.get (for BumperMissions.System_admin)) {
Forum newForum = factory.createforum (nom, description);
Renvoie un nouveau Forumproxy (NewForum, Authorization, Permissions);
}
autre {
lancer un nouveau UnauthorizedException ();
}
}
}
La méthode CreateForum renvoie Forumproxy.
Notez qu'il y a deux proxy ici: Forumproxy et ForumFactoryProxy. Représente deux responsabilités différentes: l'utilisation du forum et la création du forum. Quant à savoir pourquoi l'utilisation d'objets est séparée de la création d'objets, c'est pourquoi le modèle d'usine est utilisé: c'est pour "encapsulation" et "répartition". En d'autres termes, les fonctions sont aussi célibataires que possible pour faciliter la maintenance et la modification.
D'autres post-création et utilisation dans le système de forum Jive sont basés sur l'idée du forum.
Ci-dessus, nous avons discuté de la façon d'utiliser le proxy pour accéder au mécanisme d'autorisation. La copie d'un objet énorme et complexe est une opération très coûteuse. Utilisez un proxy pour retarder ce processus de copie.
Par exemple: nous avons une grande collection, comme Hashtable, et de nombreux clients y accéderont simultanément en même temps. L'un des clients spéciaux doit effectuer une acquisition continue de données et, pour le moment, d'autres clients sont tenus d'ajouter ou de ne plus supprimer des choses au hashtable.
La solution la plus directe est: utilisez le verrouillage de la collection, laissez ce client spécial obtenir ce verrou, effectuer une acquisition continue de données, puis libérer le verrou.
La copie de code est la suivante:
public void fofetchhes (hashtable ht) {
synchronisé (ht) {
// Action d'acquisition de données continue spécifique ...
}
}
Cependant, cette méthode peut verrouiller la collection pendant longtemps, et d'autres clients ne pourront pas accéder à la collection au cours de cette période.
La deuxième solution consiste à fermer la collecte, puis à laisser les données continues obtenir l'opération de collecte du clone. Cette solution est fondée sur le fait que la collection est clonable et qu'il doit y avoir une méthode pour fournir un clone profond. HashTable fournit sa propre méthode de clone, mais pas le clone des objets de clé et de valeur.
La copie de code est la suivante:
public void fofetchhes (hashtable ht) {
Hashtable newht = (hashtable) ht.clone ();
}
Le problème revient.
La solution finale: nous pouvons attendre que d'autres clients aient terminé la modification avant le clonage, c'est-à-dire que ce client spécial effectue d'abord une série d'opérations d'acquisition de données en appelant une méthode appelée Clone. Mais en fait, aucune copie d'objets n'a été réellement effectuée jusqu'à ce que d'autres clients modifient la collection d'objets.
Implémentez cette solution à l'aide de Proxy, qui est l'opération de copie-écriture.
Le proxy a un large éventail d'applications.