définition:
Fournissez un substitut ou un espace réservé à un autre objet pour contrôler l'accès à lui.
Un proxy pour d'autres objets pour contrôler l'accès à cet objet.
Description générale:
Il contient généralement trois rôles: thème abstrait, thème concret et thème d'agent.
Diagramme de classe générale:
Code général:
Package Proxy; // Résumé Classe de sujets: Sujet de l'interface publique {public void DoSomething ();} Package Proxy; // Sujet spécifique classe publique classe realSubject implémente le sujet {@Override public void dosomething () {System.out.println ("Business Logic ..."); }} Package Proxy; // Proxy Topic Class Proxy implémente le sujet {Private Subject Sub = NULL; @Override public void doSomething () {this.sub.dosomething (); } public proxy (sujet sub) {this.sub = sub; }} package proxy; // Client public class Client {public static void main (String [] args) {sujet realSub = new realSubject (); Sujet proxy = nouveau proxy (realSub); proxy.dosomething (); }}avantage :
1. Responsabilités claires
2. Extension élevée
Extensions du mode proxy:
Agent normal:
Les classes de thème spécifiques sont transparentes à des niveaux de haut niveau, et des classes de thème spécifiques sont construites dans des classes de thème proxy.
Implémentation du code:
Package GeneralProxy; Sujet de l'interface publique {public void dosomething ();} package GeneralProxy; La classe publique realSubject implémente le sujet {private String name = null; @Override public void doSomething () {System.out.println (this.name + "proxy, exécutant la logique commerciale ..."); } public realSubject (Subject Proxy, String Name) lève une exception {if (proxy == null) {Throw New Exception ("Object Proxy ne peut pas être créé"); } else {this.name = name; }}} package GeneralProxy; classe publique Proxy implémente le sujet {le sujet privé realSub = null; public proxy (name de chaîne) {try {realSub = new realSubject (this, name); } catch (exception e) {e.printStackTrace (); }} public void doSomething () {realSub.dosomething (); }} package GeneralProxy; classe publique Client {public static void main (String [] args) {// Ordinary Proxy suject proxy = new proxy ("Zhang san"); proxy.dosomethaing (); }}
Proxy forcé:
Vous devez obtenir l'objet de la classe de sujets proxy en accédant à la classe de sujet spécifique, puis utiliser la classe de sujet proxy pour contrôler l'accès.
Implémentation du code:
Package MustProxy; Sujet de l'interface publique {public void doSomething (); Sujet public getProxy ();} package mustproxy; La classe publique realSubject implémente le sujet {private String name = null; Proxy de sujet privé = null; @Override public void dosomething () {if (isproxy ()) {System.out.println (this.name + "proxy, exécutant la logique métier ..."); } else {System.out.println ("Veuillez accéder au proxy d'abord ..."); }} public realSubject (String name) {this.name = name; } Sujet public getProxy () {proxy = new proxy (this); Renvoyez ce.proxy; } privé boolean isproxy () {if (this.proxy == null) {return false; } else {return true; }}} package mustproxy; classe publique Proxy implémente le sujet {le sujet privé realSub = null; Proxy public (sujet realSub) {this.realSub = realSub; } public void doSomething () {this.realsub.dosomething (); } Sujet public getProxy () {renvoie ceci; }} package mustproxy; classe publique Client {public static void main (String [] args) {sujet realSub = new realSubject ("zhang san"); realSub.doSomething (); Sujet proxy = realSub.getProxy (); proxy.dosomething (); }} Scénarios d'application
Dans le monde réel, le secrétaire équivaut à un agent. Si le patron tient une réunion, informez les employés du temps de réunion, organisez le lieu, triez le lieu après la réunion, etc., etc., vous pouvez remettre le travail lié à la réunion au secrétaire. Le patron n'a qu'à tenir la réunion et n'a pas besoin de faire ces choses en personne. De même, dans notre programmation, nous pouvons également utiliser le modèle de proxy pour découpler le code combiné avec une série de logiques non apparentées, comme le code journal dans le code commercial peut être effectué dans le proxy. L'AOP de Spring est une application proxy dynamique typique.
Formulaire de demande de mode proxy
(1) Proxy distant - peut masquer le fait qu'un objet existe dans différents espaces d'adresse. Il permet également aux clients d'accéder aux objets sur des machines distantes. Les machines distantes peuvent avoir de meilleures performances informatiques et une vitesse de traitement, et peuvent rapidement répondre et traiter les demandes des clients.
(2) Virtual Proxy permet de créer des objets avec des frais généraux de mémoire élevés en cas de besoin. Créez uniquement lorsque nous avons vraiment besoin de cet objet.
(3) Le proxy de copie-écriture est utilisé pour contrôler la copie des objets en retardant la copie des objets jusqu'à ce que le client en ait vraiment besoin. Il s'agit d'une variante du proxy virtuel.
(4) Protection (Access) Proxy) fournit différents niveaux de droits d'accès aux objets cibles pour différents clients
(5) Cache Proxy fournit un stockage temporaire pour les résultats de calcul des frais généraux. Il permet à plusieurs clients de partager des résultats pour réduire le calcul ou la latence réseau.
(6) Proxy pare-feu contrôle l'accès aux ressources du réseau et protège le sujet des clients malveillants.
(7) SynchronizationProxy fournit un accès sécurisé au sujet dans le cas du multi-threading.
(8) Proxy de référence intelligente - Lorsqu'un objet est référencé, il fournit des opérations supplémentaires, telles que l'enregistrement du nombre d'appels vers cet objet, etc.
(9) Le proxy de cachette de complexité est utilisé pour cacher la complexité d'une collection complexe d'une classe et effectuer un contrôle d'accès. Parfois, il est également appelé proxy de façade, ce qui n'est pas difficile à comprendre. Le proxy caché complexe et le mode d'apparence sont différents car le proxy contrôle l'accès, tandis que le mode d'apparence est différent car le proxy contrôle l'accès, tandis que le mode d'apparence ne fournit qu'un autre ensemble d'interfaces.