Le Pattern : Proxy

Le design pattern Proxy permet de créer un objet qui agit comme un substitut pour un autre objet.

Il permet de contrôler l'accès à cet objet en ajoutant une couche d'abstraction. En utilisant ce modèle, on peut ajouter des fonctionnalités supplémentaires sans modifier le code source original.

  • - Probleme

    Supposons que nous avons une application qui doit accéder à une ressource externe, comme un serveur distant, une base de données ou un service web. Cependant, l'accès direct à cette ressource peut être coûteux en termes de performances ou de sécurité.

    Le problème est donc de trouver un moyen d'accéder à cette ressource de manière efficace et sécurisée, sans modifier le code existant de l'application.

  • C'est là qu'intervient le design pattern Proxy. En créant un objet Proxy qui agit comme un substitut pour l'objet d'origine, on peut contrôler l'accès à la ressource externe en ajoutant une couche d'abstraction. Le Proxy peut gérer les demandes de l'application et les transmettre à la ressource externe de manière transparente. Il peut également ajouter des fonctionnalités supplémentaires, telles que la mise en cache, la vérification des autorisations, la journalisation, etc.

    Ainsi, en utilisant le design pattern Proxy, on peut résoudre le problème d'accès à une ressource externe de manière efficace et sécurisée, sans modifier le code existant de l'application.

  • Prenons l'exemple d'un gardien d'immeuble qui joue le rôle de proxy pour les locataires. Le gardien d'immeuble est responsable de nombreuses tâches, telles que la réception des colis, l'entretien des espaces communs, etc.

    Dans cet exemple, les locataires sont les clients qui souhaitent accéder aux services de l'immeuble, tandis que le gardien d'immeuble est le proxy. Lorsqu'un locataire a besoin de quelque chose, il peut s'adresser au gardien d'immeuble qui effectuera les tâches nécessaires. Le gardien d'immeuble peut également avoir des fonctions supplémentaires telles que la vérification des antécédents des visiteurs avant de les laisser entrer dans l'immeuble.

    De même, dans un système informatique, le proxy peut offrir des fonctionnalités supplémentaires telles que la mise en cache de données, la vérification de la sécurité, la gestion de l'accès distant, etc. Tout comme le gardien d'immeuble, le proxy agit comme un intermédiaire qui offre des services supplémentaires à l'utilisateur final.

  • Voici une méthode d'implémentation du pattern Proxy:

    - Identifier l'objet réel : Tout d'abord, vous devez identifier l'objet que vous souhaitez protéger ou pour lequel vous souhaitez fournir une interface supplémentaire. Cela peut être un objet coûteux à créer, un objet distant ou un objet qui nécessite des autorisations de sécurité.

    - Définir une interface commune : Créez une interface commune qui sera implémentée par l'objet réel et le proxy. Cette interface doit définir toutes les méthodes que l'utilisateur final peut appeler sur l'objet.

    - Implémenter le proxy : Implémentez le proxy en utilisant l'interface commune. Le proxy doit avoir une référence à l'objet réel et doit fournir une implémentation pour chaque méthode de l'interface commune. Cette implémentation peut inclure des opérations supplémentaires telles que la mise en cache, la vérification de la sécurité, la gestion de l'accès distant, etc.

    - Implémenter l'objet réel : Implémentez l'objet réel en utilisant également l'interface commune. Cette classe doit contenir la logique métier réelle de l'objet.

    - Utiliser le proxy : Dans le code client, créez une instance du proxy et utilisez-la pour appeler les méthodes sur l'objet. Si l'objet réel n'a pas encore été créé, le proxy doit le créer et le conserver pour une utilisation ultérieure.

    - Tester le système : Testez le système pour vous assurer que le proxy fonctionne correctement et que toutes les fonctionnalités supplémentaires sont correctement implémentées.

    En suivant cette méthode, vous pouvez implémenter le pattern Proxy dans votre système et fournir une interface supplémentaire pour l'objet réel tout en offrant des fonctionnalités supplémentaires telles que la mise en cache, la vérification de la sécurité et la gestion de l'accès distant.


  • interface ImmeubleInterface {
    public function receptionnerColis();
    public function entretenirEspacesCommuns();
    }

    class Immeuble implements ImmeubleInterface {
    public function receptionnerColis() {
    echo "Les colis ont étés reçus. \n";
    }

    public function entretenirEspacesCommuns() {
    echo "Les espaces communs sont nettoyés \n";
    }
    }

    class ProxyImmeuble implements ImmeubleInterface {
    private $immeuble;

    public function receptionnerColis() {
    if (!$this->immeuble) {
    $this->immeuble = new Immeuble();
    }
    return $this->immeuble->receptionnerColis();
    }

    public function entretenirEspacesCommuns() {
    if (!$this->immeuble) {
    $this->immeuble = new Immeuble();
    }
    return $this->immeuble->entretenirEspacesCommuns();
    }
    }

    // Utilisation du proxy
    $gardien = new ProxyImmeuble();
    $gardien->receptionnerColis(); // Appel au proxy
    $gardien->entretenirEspacesCommuns(); // Appel au proxy


    Dans cet exemple, Immeuble est l'objet réel qui représente un immeuble avec des fonctionnalités telles que la réception de colis et l'entretien des espaces communs. ProxyImmeuble est le proxy qui agit comme intermédiaire entre le client et l'objet réel.

    Le proxy vérifie si l'objet réel Immeuble a déjà été créé. Si ce n'est pas le cas, il crée un nouvel objet Immeuble. Ensuite, le proxy fournit une implémentation pour chaque méthode de l'interface commune ImmeubleInterface. Dans notre exemple, le proxy simplement appelle la méthode correspondante sur l'objet réel.

    Enfin, dans le code client, nous créons une instance du proxy ProxyImmeuble et appelons ses méthodes pour accéder aux fonctionnalités de l'immeuble. Ainsi, l'analogie du gardien d'immeuble est bien respectée, où le gardien agit comme proxy et fournit des services supplémentaires tels que la vérification des antécédents des visiteurs avant de les laisser entrer dans l'immeuble.