Maison développement back-end tutoriel php Comprendre le modèle de proxy des modèles de conception PHP dans un article

Comprendre le modèle de proxy des modèles de conception PHP dans un article

Jul 31, 2020 pm 04:59 PM
php设计模式 代理模式

Le modèle proxy est un modèle de conception structurelle, ciblant la structure classique dans laquelle les classes et les objets sont combinés. Le modèle de proxy est également un modèle de conception fréquemment utilisé sur lequel nous devons nous concentrer. Il peut ajouter des fonctions supplémentaires sans modifier l'objet cible.

Définition

Le modèle de proxy (Proxy) fournit un proxy pour d'autres objets pour contrôler l'accès à cet objet. Utilisez le modèle de proxy pour créer un objet proxy, laissez l'objet proxy contrôler l'accès à l'objet cible (l'objet cible peut être un objet distant, un objet coûteux à créer ou un objet qui nécessite un contrôle de sécurité), et vous pouvez ajoutez quelques extras sans changer la fonction de l'objet cible.

Problème

Actuellement, le système dispose d'une classe de connexion pour la connexion et l'enregistrement des utilisateurs. Le pseudocode est le suivant :

class UserLogin
{
    // …… 省略属性和部分方法
    
    public function login ($name, $pass)
    {
        // 登录业务
    }
    
    public function reg ($name, $pass)
    {
        // 注册业务
    }
}
Copier après la connexion

Maintenant, nous souhaitons ajouter une fonction à l'activité de connexion et d'enregistrement des utilisateurs - limitation actuelle, afin que le client puisse limiter la fréquence d'appel de cette méthode à un maximum de 5 fois par seconde. Maintenant, implémentons cette fonction. Le pseudo-code est le suivant :

class UserLogin
{
    // …… 省略属性和部分方法
    
    public function login ($name, $pass)
    {
        // 限流
        $limit = new Limit();
        if ($limit->restrict()) {
            // ……
        }
        
        // 登录业务
    }
    
    public function reg ($name, $pass)
    {
        // 限流
        $limit = new Limit();
        if ($limit->restrict()) {
            // ……
        }
        
        // 注册业务
    }
}
Copier après la connexion

Jetez un œil au code ci-dessus. Premièrement, le code limitant actuel envahit le code métier et est fortement couplé au code métier. code des affaires. Deuxièmement, les limitations actuelles n’ont rien à voir avec le code des affaires et violent le principe de responsabilité unique.

Implémentation

Ensuite, nous réécrivons le code ci-dessus en utilisant le mode proxy. Le code réécrit ressemble à ceci :

interface IUserLogin
{
    function login ();
    function register ();
}

class UserLogin implements IUserLogin
{
    // …… 省略属性和部分方法
    
    public function reg ($uname, $pass)
    {
        // 注册业务
    }
    
    public function login ($uname, $pass)
    {
        // 登录业务
    }
}

class UserLoginProxy implements IUserLogin
{
    private $limit = null;
    private $login = null;
    
    public function __construct(Limit $limit, Login $login)
    {
        $this->limit = $limit;
        $this->login = $login;
    }
    
    public function login($uname, $pass)
    {
        if ($this->limit->restrict()) {
            // ...
        }
        return $this->login->login($uname, $pass);
    }
    
    public function register($uname, $pass)
    {
        if ($this->limit->restrict()) {
            // ...
        }
        return $this->login->register($uname, $pass);
    }
}
Copier après la connexion

. La méthode ci-dessus est basée sur l'idée de conception d'interface plutôt que sur la programmation d'implémentation. Mais si la classe d'origine ne définit pas d'interface, ou si cette classe n'est pas développée et maintenue par nous, alors comment implémenter le mode proxy ?

Pour l'extension de cette classe externe, nous utilisons généralement l'héritage.

class UserLogin
{
    public function reg ($uname, $pass)
    {
        // 注册业务
    }
    
    public function login ($uname, $pass)
    {
        // 登录业务
    }
}

class UserLoginProxy extends Login
{
    private $limit = null;
    
    public function __construct(Limit $limit, Login $login)
    {
        $this->limit = $limit;
        $this->login = $login;
    }
    
    public function login($uname, $pass)
    {
        if ($this->limit->restrict()) {
            // ...
        }
        return parent::login($uname, $pass);
    }
    
    public function reg($uname, $pass)
    {
        if ($this->limit->restrict()) {
            // ...
        }
        return parent::register($uname, $pass);
    }
}
Copier après la connexion

Regardez le code ci-dessus. Y a-t-il des problèmes ? Vous constaterez que le code similaire

if ($this->limit->restrict()) {
    // ...
}
Copier après la connexion

apparaît deux fois. Maintenant, nous ajoutons simplement la fonction de limitation actuelle à deux méthodes. Si la classe UserLogin a 10 méthodes et que nous voulons ajouter la fonction de limitation actuelle à chaque méthode, nous devons alors copier ce code 10 fois. Si nous voulons ajouter une fonction de limitation de courant à toutes les méthodes de 10 classes et que chaque classe dispose de 10 méthodes, alors le code de limitation de courant ci-dessus sera répété 100 fois.

Bien sûr, vous direz que je peux encapsuler le code limitant actuel dans une fonction pour résoudre le problème ci-dessus ? Mais il reste un problème qui ne peut pas être résolu. Chaque méthode de la classe d'origine doit être réimplémentée dans la classe proxy. Tout comme il existe des méthodes reg et login dans la classe d'origine ci-dessus, il existe également des méthodes reg et login dans la classe proxy.

Procuration dynamique

Comment résoudre les problèmes ci-dessus, nous pouvons utiliser un proxy dynamique pour le résoudre. Si vous souhaitez utiliser un proxy dynamique, vous devez comprendre et utiliser le mécanisme de réflexion en PHP.

php dispose d'une API de réflexion complète, ajoutant la possibilité de procéder à l'ingénierie inverse des classes, des interfaces, des fonctions, des méthodes et des extensions. De plus, l'API Reflection fournit des méthodes pour extraire les commentaires de documentation des fonctions, classes et méthodes. Concernant les connaissances liées à la réflexion PHP, je n'entrerai pas dans les détails ici. Vous pouvez vérifier les informations pertinentes par vous-même.

Notez que l'utilisation de la réflexion consomme beaucoup de performances, veuillez donc ne pas l'utiliser dans des circonstances normales.

Montrons comment utiliser la réflexion pour implémenter un proxy dynamique. Le pseudo-code est le suivant :

class UserLogin
{
    public function reg ($uname, $pass)
    {
        // 注册业务
        echo '注册业务' . PHP_EOL;
    }
    public function login ($uname, $pass)
    {
        // 登录业务
        echo '登录业务' . PHP_EOL;
    }
}
class LimitProxy
{
    // 用来保存多个实例对象
    private $target = [];
    public function __construct(Object $obj)
    {
        $this->target[] = $obj;
    }
    public function __call($name, $arguments)
    {
        foreach ($this->target as $obj) {
            $ref = new \ReflectionClass($obj);
            if ($method = $ref->getMethod($name)) {
                if ($method->isPublic() && !$method->isAbstract()) {
                    // 限流
                    echo "这里是限流业务处理" . PHP_EOL;
                    $result = $method->isStatic() ? $method->invoke(null, $obj, ...$arguments) : $method->invoke($obj, ...$arguments);
                    return $result;
                }
            }
        }
    }
}
Copier après la connexion

Le code de test est le suivant :

$login = new Login();
$loginProxy = new LimitProxy($login);
$loginProxy->reg('gwx', '111111');
$loginProxy->login('james', '111111111');
Copier après la connexion

Scénario d'application

  • Contrôle d'accès (agent de protection). Par exemple, le système dispose d'un module de commande. À l'origine, ce module disposait également d'un contrôle des autorisations, mais nous souhaitons désormais qu'il ne soit accessible qu'aux clients disposant d'adresses IP spécifiées. Nous pouvons ensuite utiliser le mode proxy.

  • L'exécution locale de services distants (proxy distant) convient aux situations où l'objet de service est situé sur un serveur distant.

  • Développer certaines exigences non fonctionnelles dans le code métier, telles que : limitation de courant, statistiques, journalisation

  • Applications de mise en cache, par exemple, ajouter un proxy de cache Lorsque le cache existe, le proxy de cache est appelé pour obtenir les données mises en cache. Lorsque le cache n'existe pas, l'interface d'origine est appelée.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment résoudre l'erreur d'accès refusé aux paramètres de proxy en écriture sous Windows 11 ? Comment résoudre l'erreur d'accès refusé aux paramètres de proxy en écriture sous Windows 11 ? May 06, 2023 pm 10:37 PM

De nombreux utilisateurs de Windows 11 ont signalé avoir vu le message d'erreur « Erreur d'écriture des paramètres de proxy - L'accès est refusé » lors du démarrage du système ou lors de la tentative d'exécution de commandes via l'invite de commande. Habituellement, cette erreur se produit lorsque vous essayez d'exécuter une commande ou après la mise à niveau vers le système d'exploitation Windows, certaines applications tierces mal installées peuvent interférer avec l'invite de commande. Êtes-vous gêné par cette erreur d’écriture du message des paramètres de proxy sur votre ordinateur Windows 11 ? Alors vous êtes arrivé au bon endroit. Dans cet article, nous avons sélectionné quelques solutions possibles qui peuvent vous aider à résoudre ce problème sur votre ordinateur. Correctif 1 – Modifier l’application de terminal par défaut de Windows. Démarrez-vous à partir de Windo

Quels sont les avantages et les inconvénients du mode proxy dans le framework Java ? Quels sont les avantages et les inconvénients du mode proxy dans le framework Java ? Jun 03, 2024 am 09:34 AM

Le modèle de proxy est un modèle de conception de framework Java qui sert d'intermédiaire entre le client et l'objet cible en créant un objet proxy. Ses avantages incluent : la protection des objets cibles, l'intégrité et la sécurité des données ; le contrôle de l'accès à la cible, la mise en œuvre de mesures de contrôle des autorisations et de sécurité, l'ajout de fonctions supplémentaires telles que la journalisation, la mise en cache et la gestion des transactions ; objectifs. Cependant, le modèle de proxy présente également des inconvénients : Frais généraux : la création et la maintenance d'objets proxy peuvent réduire les performances ; Complexité : nécessite une compréhension approfondie du modèle de conception. Accès restreint aux cibles, ce qui peut ne pas être approprié dans certains cas.

Modèles de conception couramment utilisés en PHP et leurs méthodes de mise en œuvre Modèles de conception couramment utilisés en PHP et leurs méthodes de mise en œuvre Jun 27, 2023 pm 01:08 PM

PHP est un langage de programmation largement utilisé et très populaire. PHP est une partie très importante des applications Web actuelles. Les modèles de conception jouent un rôle essentiel dans le développement d'applications PHP. Le modèle de conception est un modèle pour résoudre des problèmes qui peut être réutilisé dans différents environnements. Il nous aide à écrire un meilleur code et à le rendre plus fiable, maintenable et évolutif. Dans cet article, nous explorerons certains modèles de conception couramment utilisés en PHP et comment les implémenter. Modèle Singleton Le modèle Singleton est un modèle de création qui permet

Modèles de conception PHP : le chemin vers l'excellence du code Modèles de conception PHP : le chemin vers l'excellence du code Feb 21, 2024 pm 05:30 PM

Introduction Les modèles de conception PHP sont un ensemble de solutions éprouvées aux défis courants du développement de logiciels. En suivant ces modèles, les développeurs peuvent créer un code élégant, robuste et maintenable. Ils aident les développeurs à suivre les principes SOLID (responsabilité unique, ouvert-fermé, remplacement de Liskov, isolation d'interface et inversion de dépendance), améliorant ainsi la lisibilité, la maintenabilité et l'évolutivité du code. Types de modèles de conception Il existe de nombreux modèles de conception différents, chacun ayant son propre objectif et ses avantages. Voici quelques-uns des modèles de conception PHP les plus couramment utilisés : Modèle Singleton : garantit qu'une classe n'a qu'une seule instance et fournit un moyen d'accéder à cette instance de manière globale. Modèle d'usine : crée un objet sans spécifier sa classe exacte. Il permet aux développeurs de conditionnellement

Modèle de proxy en Java Modèle de proxy en Java Jun 07, 2023 pm 11:22 PM

Le modèle de proxy dans Java Proxy est un modèle de conception qui permet à un objet d'apparaître sous la forme d'un autre objet et d'accéder à l'objet d'origine via l'objet proxy. Les proxys sont largement utilisés dans de nombreuses applications, la plus courante étant la mise en œuvre d'appels d'objets distants et la journalisation sur le réseau. Il existe également de nombreux exemples d'utilisation du modèle de proxy en Java. Le modèle de proxy en Java est principalement implémenté des trois manières suivantes : Proxy statique Le proxy statique est implémenté en créant une classe proxy pendant la phase de compilation. Classe proxy et implémentation de la classe originale

Quels sont les modèles de conception en php ? Quels sont les modèles de conception en php ? Jul 25, 2023 am 09:39 AM

Les modèles de conception PHP incluent : 1. le mode Singleton, qui garantit qu'une classe n'a qu'un seul objet instancié ; 2. le mode Factory, qui encapsule le processus d'instanciation de l'objet dans une classe factory ; 3. le mode factory abstrait, qui est similaire à un mode usine ; Modèle d'usine pour créer des objets 4. Modèle d'observateur, réalisant des dépendances un à plusieurs entre les objets 5. Modèle d'adaptateur, convertissant l'interface d'une classe en interface d'une autre classe 6. Modèle de décorateur, ajouter dynamiquement quelques fonctions supplémentaires à ; un objet ; 7. Modèle d'itérateur ; 8. Modèle de stratégie ; 9. Modèle de méthode de modèle, etc.

Quels sont les modèles de conception dans PHP7.0 ? Quels sont les modèles de conception dans PHP7.0 ? May 26, 2023 am 09:21 AM

Avec le développement continu de la technologie, les modèles de conception deviennent de plus en plus importants dans le développement de logiciels. En tant que dernière version de PHP, PHP7.0 intègre également de nombreux modèles de conception. Dans cet article, nous explorerons les modèles de conception de PHP7.0 pour aider les programmeurs PHP à mieux comprendre et appliquer ces modèles. Modèle Singleton Le modèle singleton est un modèle de création qui garantit qu'une classe n'a qu'une seule instance et fournit un point d'accès global. En PHP7.0, vous pouvez utiliser la méthode __construct et la méthode statique pour

Modèles et pratiques de conception de base PHP Modèles et pratiques de conception de base PHP Nov 08, 2023 pm 08:58 PM

Introduction aux modèles et pratiques de conception de base PHP : les modèles de conception sont des modèles de résolution de problèmes couramment utilisés dans le développement de logiciels. Ils fournissent une solution réutilisable qui peut nous aider à suivre les meilleures pratiques et les bons principes de conception de logiciels pendant le processus de développement. En tant que langage de programmation largement utilisé, PHP possède également de nombreux modèles de conception communs et utiles qui peuvent être utilisés dans le développement de base. Cet article présentera plusieurs modèles de conception PHP courants et fournira des exemples de code pertinents. 1. Mode Singleton (Singleton) Le mode Singleton est un type qui permet uniquement

See all articles