Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Design Patterns en PHP
  3. Le design pattern Proxy
Extrait - Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
Extraits du livre
Design Patterns en PHP Les 23 modèles de conception : descriptions et solutions illustrées en UML2 et PHP (2e édition)
2 avis
Revenir à la page d'achat du livre

Le design pattern Proxy

Description

Le design pattern Proxy a pour objectif la conception d’un objet qui se substitue à un autre et en contrôle l’accès.

Exemple

Nous voulons offrir pour chaque véhicule du catalogue la possibilité de visualiser un film qui le présente. Un clic sur la photo de la présentation du véhicule permet de jouer ce film.

Une page du catalogue contient de nombreux véhicules et il est très lourd de créer en mémoire tous les objets d’animation car les films nécessitent une grande quantité de mémoire et leur transfert au travers d’un réseau prend beaucoup de temps.

Le design pattern Proxy offre une solution à ce problème en différant la création des sujets jusqu’au moment où le système a vraiment besoin d’eux, en l’occurrence lors du clic sur la photo du véhicule.

Cette solution apporte deux avantages :

  • La page du catalogue est chargée beaucoup plus rapidement.

  • Seuls les films devant être visualisés sont créés, chargés et joués.

L’objet photo est appelé le proxy du film. Il se substitue au film pour l’affichage. Il procède à la création effective du sujet uniquement lors du clic. Il implémente la même interface que l’objet film, rendant son utilisation parfaitement transparente pour le client. La figure 16.1 montre le diagramme des classes correspondant. La classe du proxy, AnimationProxy, et la classe du film, Film, implémentent...

Structure

1. Diagramme de classes

La figure 16.4 illustre la structure générique du design pattern Proxy.

Structure du design pattern Proxy

Figure 16.4 - Structure du design pattern Proxy

Il convient de noter que les méthodes du proxy ont deux comportements possibles quand le sujet réel n’a pas été créé : soit elles créent le sujet réel puis lui délèguent le message (cas de la méthode clic de l’exemple), soit elles exécutent un code de substitution (cas de la méthode dessine de l’exemple).

2. Participants

Les participants au design pattern Proxy sont les suivants :

  • Sujet (AnimationInterface) est l’interface commune au proxy et au sujet réel.

  • SujetReel (Film) est l’objet que le proxy contrôle et représente.

  • Proxy (AnimationProxy) est l’objet qui se substitue au sujet réel. Il possède une interface identique à ce dernier (interface Sujet). Il est chargé de créer et de détruire le sujet réel et de lui déléguer les messages.

3. Collaborations

Le proxy reçoit les appels du client à la place du sujet réel. Quand il le juge approprié, il délègue ces messages au sujet réel. Il doit, dans ce cas, créer le sujet réel si ce n’est pas déjà fait.

Domaines d’application

Les proxies sont très utilisés en programmation orientée objet. Il existe différents types de proxy. Nous en illustrons trois :

  • Proxy virtuel : permet de créer un objet de taille importante au moment approprié. 

  • Proxy remote : permet d’accéder à un objet s’exécutant dans un autre environnement.

  • Proxy de protection : permet de sécuriser l’accès à un objet, par exemple par des techniques d’authentification.

Exemple en PHP

Nous reprenons notre exemple en PHP. Le code source de l’interface AnimationInterface est donné ci-dessous.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Proxy; 
 
interface AnimationInterface 
{ 
   public function dessine(): void; 
 
   public function clic(): void; 
} 

Le code PHP de la classe Film qui implémente cette interface se trouve à la suite. Dans le cadre de la simulation, chaque méthode affiche simplement un message à l’écran.

<?php 
 
declare(strict_types=1); 
 
namespace ENI\DesignPatterns\Proxy; 
 
class Film implements AnimationInterface 
{ 
   public function clic(): void 
   { 
       echo 'Evenement clic reçu' . PHP_EOL; 
   } 
 
   public function dessine(): void 
   { 
       echo 'Affichage du film' . PHP_EOL; 
   } 
 
   public function charge(): void 
   { 
       echo 'Chargement du film' . PHP_EOL; 
   } 
 
   public function joue(): void 
   { 
       echo 'Lecture du film'...