Définition :
Fournissez un substitut ou un espace réservé pour un autre objet afin de contrôler l'accès à celui-ci.
Fournissez un proxy pour que d'autres objets contrôlent l'accès à cet objet.
Description générale :
Contient généralement trois rôles : thème abstrait, thème concret et thème agent.
Thème abstrait : il s'agit d'une classe ou d'une interface abstraite et d'une définition commune de type d'entreprise.
Thème spécifique : l'exécuteur spécifique de la logique métier
Rôle d'agent : responsable de l'application des rôles réels et délègue toutes les restrictions de méthode définies par les classes de thème abstraites à des rôles de thème réels pour la mise en œuvre.
Schéma général des classes :
Code général :
package Proxy; //抽象主题类: public interface Subject { public void doSomething(); } package Proxy; //具体主题类 public class RealSubject implements Subject{ @Override public void doSomething() { System.out.println("业务逻辑..."); } } package Proxy; //代理主题类 public class Proxy implements Subject{ private Subject sub = null; @Override public void doSomething() { this.sub.doSomething(); } public Proxy(Subject sub){ this.sub = sub; } } package Proxy; //客户端 public class Client { public static void main(String[] args) { Subject realsub = new RealSubject(); Subject proxy = new Proxy(realsub); proxy.doSomething(); } }
Avantages :
1. Responsabilités claires
2. Haute expansion
Extension du mode proxy :
Procuration ordinaire :
La classe de thème spécifique est transparente au haut niveau, et le spécifique Le thème est construit dans la classe de thème proxy Classe
Implémentation du code :
package GeneralProxy; public interface Subject { public void doSomething(); } package GeneralProxy; public class RealSubject implements Subject{ private String name = null; @Override public void doSomething() { System.out.println(this.name + "被代理,正在执行业务逻辑..."); } public RealSubject(Subject proxy,String name) throws Exception{ if(proxy == null){ throw new Exception("无法创建被代理对象"); }else{ this.name = name; } } } package GeneralProxy; public class Proxy implements Subject{ private Subject realsub = null; public Proxy(String name) { try { realsub = new RealSubject(this, name); } catch (Exception e) { e.printStackTrace(); } } public void doSomething() { realsub.doSomething(); } } package GeneralProxy; public class Client { public static void main(String[] args) { //普通代理 Subject proxy = new Proxy("张三"); proxy.doSomethaing(); } }
Proxy forcé :
Vous devez obtenir l'objet de la classe de thème proxy en accédant au spécifique classe de thème, puis utilisez la classe de thème proxy pour contrôler l'accès
Implémentation du code :
package MustProxy; public interface Subject { public void doSomething(); public Subject getProxy(); } package MustProxy; public class RealSubject implements Subject{ private String name = null; private Subject proxy = null; @Override public void doSomething() { if(isProxy()){ System.out.println(this.name + "被代理,正在执行业务逻辑..."); }else{ System.out.println("请先访问代理..."); } } public RealSubject(String name) { this.name = name; } public Subject getProxy() { proxy = new Proxy(this); return this.proxy; } private boolean isProxy(){ if(this.proxy == null){ return false; }else{ return true; } } } package MustProxy; public class Proxy implements Subject{ private Subject realSub = null; public Proxy(Subject realSub) { this.realSub = realSub; } public void doSomething() { this.realSub.doSomething(); } public Subject getProxy() { return this; } } package MustProxy; public class Client { public static void main(String[] args) { Subject realSub = new RealSubject("张三"); realSub.doSomething(); Subject proxy = realSub.getProxy(); proxy.doSomething(); } }
Scénario d'application
Dans le monde réel, une secrétaire équivaut à un agent Quand. le patron a une réunion, il informe les employés de l'heure de la réunion, organise le lieu, nettoie le lieu après la réunion, etc. Le travail lié aux réunions peut être laissé au secrétaire, et le patron n'a qu'à assister aux réunions et à le faire pas besoin de faire ces choses lui-même. De la même manière, le modèle de proxy peut également être utilisé dans notre programmation pour découpler une série de codes combinés avec une logique non liée. Par exemple, la journalisation du code dans le code métier peut être effectuée dans le proxy. L'AOP de Spring est une application proxy dynamique typique.
Formulaires de demande du mode proxy
(1) Proxy distant - peut masquer le fait qu'un objet existe dans un espace d'adressage différent. Cela permet également au client d'accéder aux objets sur la machine distante. La machine distante peut avoir de meilleures performances de calcul et une meilleure vitesse de traitement et peut répondre et traiter rapidement les demandes du client.
(2) Proxy virtuel – Permet de créer des objets avec une surcharge de mémoire importante en cas de besoin. Créez cet objet uniquement lorsque nous en avons vraiment besoin.
(3) Copy-On-Write Proxy - Utilisé pour contrôler la copie d'objets en retardant la copie d'objets jusqu'à ce que le client en ait vraiment besoin. Est une variante de l'agent virtuel.
(4) Protection Proxy (Protection (Access) Proxy) – Fournit différents niveaux d'autorisations d'accès aux objets cibles pour différents clients
(5) Cache Proxy (Cache Proxy) – Fournit un stockage temporaire pour les résultats de calculs coûteux, ce qui permet plusieurs clients pour partager les résultats afin de réduire la latence de calcul ou du réseau.
(6) Firewall Proxy – Contrôle l’accès aux ressources réseau et protège les thèmes des clients malveillants.
(7)SynchronizationProxy – Fournit un accès sécurisé aux sujets dans des situations multithread.
(8) Smart ReferenceProxy - Lorsqu'un objet est référencé, il fournit des opérations supplémentaires, telles que l'enregistrement du nombre d'appels à cet objet.
(9) Complexity HidingProxy – Utilisé pour masquer la complexité d'une collection complexe d'une classe et effectuer un contrôle d'accès. Parfois, on l’appelle aussi Façade Proxy, ce qui n’est pas difficile à comprendre. Le proxy caché complexe est différent du modèle de façade car le proxy contrôle l'accès, tandis que le modèle de façade est différent parce que le proxy contrôle l'accès, tandis que le modèle de façade fournit simplement un autre ensemble d'interfaces.
Pour plus d'exemples expliquant comment utiliser le modèle de proxy dans la programmation de modèles de conception Java, veuillez faire attention au site Web PHP chinois pour les articles connexes !