Article de reference

Modèle de proxy

En programmation , le modèle proxy est un patron de conception logicielle qui désigne une classe servant d'interface à une autre ressource. Le proxy peut interagir avec n'import...

En programmation , le modèle proxy est un patron de conception logicielle qui désigne une classe servant d'interface à une autre ressource. Le proxy peut interagir avec n'importe quelle ressource : une connexion réseau, un objet volumineux en mémoire, un fichier, ou toute autre ressource coûteuse ou impossible à dupliquer. En bref, un proxy est un objet intermédiaire ou agent appelé par le client pour accéder à l'objet serveur réel en arrière-plan. L'utilisation du proxy peut se limiter à la transmission des requêtes vers l'objet réel, ou inclure une logique supplémentaire. Le proxy peut implémenter des fonctionnalités additionnelles, comme la mise en cache lorsque les opérations sur l'objet réel sont gourmandes en ressources, ou la vérification des préconditions avant l'exécution de ces opérations. Pour le client, l'utilisation d'un objet proxy est similaire à celle de l'objet réel, car les deux implémentent la même interface.

modèles de conception GoF bien connus qui décrivent comment résoudre les problèmes de conception récurrents pour concevoir des logiciels orientés objet flexibles et réutilisables , c'est-à-dire des objets plus faciles à implémenter, à modifier, à tester et à réutiliser.

Problème

Le modèle de conception proxy est utilisé pour résoudre de tels problèmes :

  • L'accès à un objet doit être contrôlé.
  • Des fonctionnalités supplémentaires devraient être fournies lors de l'accès à un objet.

Lors de l'accès à des objets sensibles, par exemple, il devrait être possible de vérifier que les clients disposent des droits d'accès nécessaires.

Solution

Définissez un Proxyobjet distinct qui

  • peut être utilisé comme substitut d'un autre objet ( Subject), et
  • implémente des fonctionnalités supplémentaires pour contrôler l'accès à ce sujet.

Cela permet de travailler à travers un Proxyobjet pour effectuer des fonctionnalités supplémentaires lors de l'accès à un sujet, comme la vérification des droits d'accès des clients accédant à un objet sensible.

Pour se substituer à un sujet, un proxy doit implémenter l' Subjectinterface. Les clients ne peuvent pas savoir s'ils interagissent avec un sujet ou avec son proxy.

Voir également le diagramme de classes et de séquences UML ci-dessous.

Structure

Diagramme de classes et de séquence UML

Un exemple de diagramme de classes et de séquence UML pour le modèle de conception Proxy.

Dans le diagramme de classes UML ci-dessus , la classe implémente l' interface afin de pouvoir servir de substitut à d'autres objets. Elle conserve une référence à l'objet substitué afin de pouvoir lui transmettre les requêtes .ProxySubjectSubjectrealSubjectRealSubjectrealSubject.operation()

Le diagramme de séquence illustre les interactions lors de l'exécution : l' Clientobjet interagit avec un autre Proxyobjet qui contrôle l'accès à cet RealSubjectobjet. Dans cet exemple, l'objet Proxytransmet la requête à l'objet RealSubjectqui l'exécute.

Diagramme de classes

Proxy en UML
Proxy dans légende )

Scénarios d'utilisation possibles

proxy distant

Dans la communication entre objets distribués , un objet local représente un objet distant (appartenant à un espace d'adressage différent). L'objet local sert de proxy pour l'objet distant ; l'appel d'une méthode sur l'objet local entraîne l'appel d'une méthode sur l'objet distant. On peut citer en exemple l'implémentation d'un distributeur automatique de billets (DAB ), où le DAB peut contenir des objets proxy pour les informations bancaires présentes sur le serveur distant.

Proxy virtuel

C++ :

, filename ); }private : void loadFromDisk () const { std :: println ( "Chargement de l'image depuis le disque : {}" , nom_du_fichier ); } };// Proxy (contrôle l'accès à RealImage) class ProxyImage : public Image { private : string filename ; mutable unique_ptr < RealImage > realImage ; // créé à la demande public : explicit ProxyImage ( const string & file ) : filename { file } {}void display () const override { if ( ! realImage ) { std :: println ( "(Proxy) Chargement de l'image à la demande..." ); realImage = std :: make_unique <RealImage> ( filename ); } realImage- > display ( ); } } ;// Code client int main () { Image * img = new ProxyImage ( "photo.png" );// Premier affichage (devrait se charger) img -> display ();// Deuxième affichage (devrait utiliser l'image en cache) img -> display ();supprimer l'image ; retourner 0 ; }