Maison  >  Article  >  développement back-end  >  Comment implémenter le mode proxy en php

Comment implémenter le mode proxy en php

不言
不言original
2018-07-05 10:45:304385parcourir

Cet article présente principalement la méthode d'implémentation du mode proxy en PHP. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Modèle de proxy :

Fournissez un proxy pour un objet, et l'objet proxy contrôle la référence à l'objet d'origine. Le modèle proxy est appelé Proxy ou Surrogate en anglais. Il s'agit d'un modèle structurel d'objet

Motivation du modèle :

Dans certains cas, un client ne veut pas ou ne peut pas référencer directement un objet. peut transmettre un Un tiers appelé "proxy" est utilisé pour implémenter des références indirectes. L'objet proxy peut jouer un rôle intermédiaire entre le client et l'objet cible, et peut supprimer le contenu et les services que le client ne peut pas voir ou ajouter des services supplémentaires dont le client a besoin via l'objet proxy.
En introduisant un nouvel objet (comme une petite image et un objet proxy distant) pour réaliser le fonctionnement de l'objet réel ou en utilisant le nouvel objet comme remplaçant de l'objet réel, ce mécanisme de mise en œuvre est le mode proxy .En introduisant l'objet proxy Accéder indirectement à un objet, c'est la motivation du modèle proxy.

Le mode proxy comprend les rôles suivants :

Rôle de sujet abstrait (Subject) : définit les interfaces publiques de RealSubject et Proxy, afin que Proxy puisse être utilisé partout où RealSubject est utilisé.
Rôle du sujet réel (RealSubject) : définit l'entité réelle représentée par Proxy.
Objet proxy (Proxy) : enregistre une référence afin que le proxy puisse accéder à l'entité et fournit une interface identique à l'interface RealSubject, afin que le proxy puisse être utilisé à la place de l'entité (RealSubject).

Diagramme UML :

Implémentation du code :

<?php
header("Content-type:text/html;Charset=utf-8");//定义RealSubject和Proxy共同具备的东西
interface Subject{    
function say();    
function run();
}
class RealSubject implements Subject{    
private $name;    
function __construct($name){        
$this->name = $name;
    }    function say(){        
    echo $this->name."在吃饭<br>";
    }    function run(){        
    echo $this->name."在跑步<br>";
    }
}
class Proxy implements Subject{    
private $realSubject = null;    
function __construct(RealSubject $realSubject = null){        
if(empty($realSubject)){            
$this->realSubject = new RealSubject();
        }else{            
        $this->realSubject = $realSubject;
        }
    }    function say(){        
    $this->realSubject->say();
    }    function run(){        
    $this->realSubject->run();
    }
}//测试
$subject = new RealSubject("张三");
$proxy = new Proxy($subject);$proxy->say();
$proxy->run();
/*张三在吃饭
张三在跑步*/
?>

Avantages :

Le mode proxy peut coordonner l'appelant et l'appelé, réduisant dans une certaine mesure le couplage du système.
Le proxy distant permet au client d'accéder aux objets sur la machine distante. La machine distante peut avoir de meilleures performances de calcul et une meilleure vitesse de traitement et peut répondre et traiter rapidement les demandes du client.
En utilisant un petit objet pour représenter un gros objet, l'agent virtuel peut réduire la consommation des ressources système, optimiser le système et augmenter la vitesse d'exécution.
Les agents de protection peuvent contrôler l'accès aux objets réels.

Inconvénients :

En raison de l'ajout d'un objet proxy entre le client et le sujet réel, certains types de modes proxy peuvent entraîner un traitement plus lent de la requête.
La mise en œuvre de modèles de proxy nécessite un travail supplémentaire et la mise en œuvre de certains modèles de proxy est très complexe.

Scénarios applicables :

Selon le but de l'utilisation du mode proxy, les modes proxy courants ont les types suivants :
1. Proxy distant (à distance) : fournit des services pour un objet situé dans un autre espace d'adressage Un objet proxy local. Cet espace d'adressage différent peut se trouver dans le même hôte ou dans un autre hôte. Le proxy distant est également appelé Ambassadeur.
 2. Proxy virtuel : si vous devez créer un objet qui consomme une grande quantité de ressources, créez d'abord un objet qui consomme des quantités relativement faibles de ressources pour le représenter. L'objet réel ne sera créé qu'en cas de besoin.
3. Agent de copie sur écriture : c'est un type d'agent virtuel qui retarde l'opération de copie (clonage) jusqu'à ce qu'elle soit exécutée uniquement lorsque le client en a vraiment besoin. De manière générale, le clonage profond d'un objet est une opération coûteuse. Le proxy Copy-on-Write peut retarder cette opération et l'objet ne sera cloné que lorsqu'il sera utilisé.
4. Agent de protection (Protect ou Access) : contrôle l'accès à un objet et peut fournir différents niveaux d'autorisations d'utilisation à différents utilisateurs.
5. Agent de cache : fournit un espace de stockage temporaire pour les résultats d'une certaine opération cible afin que plusieurs clients puissent partager ces résultats.
6. Agent pare-feu : Protégez la cible des utilisateurs malveillants.
7. Agent de synchronisation : permet à plusieurs utilisateurs d'utiliser un objet en même temps sans conflit.
8. Agent Smart Reference : Lorsqu'un objet est référencé, il fournit des opérations supplémentaires, comme l'enregistrement du nombre de fois que cet objet a été appelé.

几种常用的代理模式:
  1、图片代理:一个很常见的代理模式的应用实例就是对大图浏览的控制。
  用户通过浏览器访问网页时先不加载真实的大图,而是通过代理对象的方法来进行处理,在代理对象的方法中,先使用一个线程向客户端浏览器加载一个小图片,然后在后台使用另一个线程来调用大图片的加载方法将大图片加载到客户端。当需要浏览大图片时,再将大图片在新网页中显示。如果用户在浏览大图时加载工作还没有完成,可以再启动一个线程来显示相应的提示信息。通过代理技术结合多线程编程将真实图片的加载放到后台来操作,不影响前台图片的浏览。
    2、远程代理:远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的远程业务对象是局域的而不是远程的,而远程代理对象承担了大部分的网络通信工作。
  3、虚拟代理:当一个对象的加载十分耗费资源的时候,虚拟代理的优势就非常明显地体现出来了。虚拟代理模式是一种内存节省技术,那些占用大量内存或处理复杂的对象将推迟到使用它的时候才创建。
  在应用程序启动的时候,可以用代理对象代替真实对象初始化,节省了内存的占用,并大大加速了系统的启动时间。
  4、动态代理:动态代理是一种较为高级的代理模式,它的典型应用就是Spring AOP。
  在传统的代理模式中,客户端通过Proxy调用RealSubject类的request()方法,同时还在代理类中封装了其他方法(如preRequest()和postRequest()),可以处理一些其他问题。
  如果按照这种方法使用代理模式,那么真实主题角色必须是事先已经存在的,并将其作为代理对象的内部成员属性。如果一个真实主题角色必须对应一个代理主题角色,这将导致系统中的类个数急剧增加,因此需要想办法减少系统中类的个数,此外,如何在事先不知道真实主题角色的情况下使用代理主题角色,这都是动态代理需要解决的问题。

另一个例子:

设计模式之代理模式(php实现)

github地址:https://github.com/ZQCard/design_pattern

/**
 * 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
 *  1、Windows 里面的快捷方式。
 * 2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,
 * 猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。
 * 3、买火车票不一定在火车站买,也可以去代售点。
 * 4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。
 *优点:
 * 1、职责清晰。 2、高扩展性。 3、智能化。
 * 缺点:
 * 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
 * 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
 * 例子:从服务器读取一张图片的时候,第一次从硬盘读取,将资源对象代理,第二次读取的时候就使用代理对象去读取。 */

(1)Image.class.php(接口)

<?php

namespace Proxy;interface Image
{    public function display();
}

(2)RealImage.class.php

<?php

namespace Proxy;class RealImage implements Image
{    private $fileName;    public function __construct($fileName)
    {        $this->fileName = $fileName;        $this->loadFromDisk($fileName);
    }    public function display()
    {        print_r("Displaying ". $this->fileName);        echo &#39;<pre/>&#39;;
    }    private function loadFromDisk($fileName)
    {        print_r("Loading ". $fileName);        echo &#39;<pre/>&#39;;
    }
}

(3)ProxyImage.class.php(代理类)

<?php

namespace Proxy;class ProxyImage implements Image
{    private $realImage;    private $fileName;    
public function __construct($fileName)
    {        $this->fileName = $fileName;
    }    public function display()
    {        if ($this->realImage == null){            
    $this->realImage = new RealImage($this->fileName);
        }        return $this->realImage->display();
    }
}

(4)proxy.php

3b7462c1ecb9e636460d764deddddf92

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

PHP中的操作mysqli的预处理prepare

单例模式连接数据库的方法

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:
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