Patron Proxy

Dans le patron Proxy, une classe représente la fonctionnalité d'une autre classe. Ce type de patron de conception est un patron structurel.

Le patron Proxy contrôle l'accès à l'objet d'origine en introduisant un objet proxy. L'objet proxy agit comme un intermédiaire entre le client et l'objet cible, chargé de transmettre les requêtes du client à l'objet cible, et peut effectuer un traitement supplémentaire avant et après la transmission de la requête.

Dans le patron Proxy, nous créons un objet qui contient un objet existant afin de fournir une interface fonctionnelle au monde extérieur.

Introduction

intention

Fournir un proxy pour un autre objet afin de contrôler l'accès à cet objet.

Principaux problèmes résolus

  • Le patron Proxy résout les problèmes qui peuvent survenir lors de l'accès direct à certains objets, tels qu'un coût de création d'objet élevé, un besoin de contrôle de sécurité ou un accès à distance.

Cas d'utilisation

  • Lorsqu'il est nécessaire d'effectuer un certain contrôle ou un traitement supplémentaire lors de l'accès à un objet.

Approche d'implémentation

  • Ajouter une couche intermédiaire: Créez une classe proxy comme couche intermédiaire pour l'objet réel.
  • Composition du proxy et de l'objet réel: La classe proxy détient une référence vers l'objet réel et contrôle l'accès lorsqu'on y accède.

Code clé

  • Classe proxy: Implémentez la même interface que l'objet réel et ajoutez une logique de contrôle supplémentaire.
  • Objet réel: l'objet qui effectue réellement la tâche.

Exemple d'application

  • Raccourci: Les raccourcis du système Windows agissent comme des proxies pour des fichiers ou des programmes.
  • Jeu de rôle: Sun Wukong agit comme un proxy pour Gao Cuilan, et Zhu Bajie ne peut pas les distinguer.
  • Point de vente: Lors de l'achat de billets de train, l'agence de billetterie agit comme un proxy pour la gare.
  • Chèque: En tant que proxy pour les fonds d'un compte bancaire, il contrôle l'accès aux fonds.
  • Spring AOP: Utilisez le patron proxy pour implémenter la programmation orientée aspect.

Avantages

  • Séparation des préoccupations: Le patron proxy sépare le contrôle d'accès de la logique métier.
  • Extensibilité: L'ajout de fonctionnalités ou de contrôles supplémentaires est flexible.
  • Intelligent: Il peut gérer intelligemment les requêtes d'accès, comme le chargement différé, la mise en cache, etc.

Inconvénients

  • Surcharge de performance: L'ajout d'une couche proxy peut affecter la vitesse de traitement des requêtes.
  • Complexité de mise en œuvre: Certains types de patrons de proxy peuvent être plus complexes à implémenter.

Suggestions d'utilisation

  • Choisissez le type de proxy approprié selon des besoins spécifiques, tels que proxy distant, proxy virtuel, proxy de protection, etc.
  • Assurez-vous que l'interface de la classe proxy est cohérente avec l'objet réel afin que les clients puissent utiliser le proxy de manière transparente.

Notes

  • Différence avec le patron Adaptateur: Le patron Adaptateur modifie l'interface, tandis que le patron Proxy ne modifie pas l'interface.
  • Différence avec le patron Décorateur: Le patron Décorateur est utilisé pour enrichir les fonctionnalités, tandis que le patron Proxy est utilisé pour contrôler l'accès.

Structure

Il implique principalement les rôles principaux suivants :

  • Sujet abstrait :

    • Définit une interface commune pour le sujet réel et le sujet proxy, afin que le sujet proxy puisse être utilisé partout où le sujet réel est utilisé.
  • Sujet réel :

    • Implémente l'interface du sujet abstrait et est l'objet réel représenté par l'objet proxy. Le client accède directement au sujet réel, mais dans certains cas, on peut y accéder indirectement via le sujet proxy.
  • Proxy :

    • Implémente l'interface du sujet abstrait et détient une référence vers le sujet réel. Le sujet proxy fournit généralement des fonctionnalités supplémentaires en plus du sujet réel, telles que le chargement paresseux, le contrôle des permissions, la journalisation, etc.
  • Client :

    • Utilise l'interface de sujet abstrait pour opérer sur le sujet réel ou le sujet proxy, sans avoir besoin de savoir de quelle classe d'implémentation spécifique il s'agit.

Implémentation

Nous allons créer une interfaceImageet implémenterImagela classe d'entité de l'interface.ProxyImageest une classe proxy, réduisantRealImagel'empreinte mémoire du chargement des objets.

ProxyPatternDemoUtilisation de la classeProxyImagepour obtenir l'objet à chargerImagel'objet, et l'affiche selon les besoins.

代理模式的 UML 图

Étape 1

Créer une interface.

Image.java

public interface Image { void display(); }

Étape 2

Créez une classe d'entité qui implémente l'interface.

RealImage.java

public class RealImage implements Image { private String fileName; public RealImage(String fileName){ this.fileName = fileName; loadFromDisk(fileName); } @Override public void display() { System.out.println("Affichage " + fileName); } private void loadFromDisk(String fileName){ System.out.println("Chargement " + fileName); } }

ProxyImage.java

public class ProxyImage implements Image{ private RealImage realImage; private String fileName; public ProxyImage(String fileName){ this.fileName = fileName; } @Override public void display() { if(realImage == null){ realImage = new RealImage(fileName); } realImage.display(); } }

Étape 3

Lorsqu'il est demandé, utilisezProxyImagepour obtenirRealImageun objet de la classe.

ProxyPatternDemo.java

public class ProxyPatternDemo { public static void main(String[] args) { Image image = new ProxyImage("test_10mb.jpg"); //L'image sera chargée depuis le disque image.display(); System.out.println(""); //Les images n'ont pas besoin d'être chargées depuis le disque image.display(); } }

Étape 4

Exécutez le programme et affichez le résultat :

Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg
autres extensions