Dieser Artikel stellt hauptsächlich die Methode zur Implementierung des Proxy-Modus in PHP vor. Er hat einen bestimmten Referenzwert. Jetzt können Freunde in Not darauf verweisen.
Stellen Sie einen Proxy für ein Objekt bereit, und das Proxy-Objekt steuert den Verweis auf das Originalobjekt. Der Proxy-Modus wird auf Englisch Proxy oder Surrogate genannt. Es handelt sich um einen Objektstrukturmodus.
Modusmotivation:
In einigen Fällen möchte oder kann ein Client nicht direkt auf ein Objekt verweisen kann eine dritte Partei namens „Proxy“ übergeben, die zur Implementierung indirekter Referenzen verwendet wird. Das Proxy-Objekt kann als Vermittler zwischen dem Client und dem Zielobjekt fungieren und über das Proxy-Objekt Inhalte und Dienste entfernen, die der Client nicht sehen kann, oder zusätzliche Dienste hinzufügen, die der Client benötigt. Durch die Einführung eines neuen Objekts (z. B. ein kleines Bild und ein Remote-Proxy-Objekt) zur Realisierung der Funktionsweise des realen Objekts oder durch die Verwendung des neuen Objekts als Ersatz für das reale Objekt ist dieser Implementierungsmechanismus der Proxy-Modus Einführung des Proxy-Objekts Der indirekte Zugriff auf ein Objekt ist die Mustermotivation des Proxy-Musters.
Der Proxy-Modus umfasst die folgenden Rollen:
RealSubject: definiert die reale Entität, die durch Proxy dargestellt wird.
Proxy-Objekt (Proxy): Speichert eine Referenz, damit der Proxy auf die Entität zugreifen kann, und stellt eine Schnittstelle bereit, die der RealSubject-Schnittstelle entspricht, sodass der Proxy anstelle der Entität (RealSubject) verwendet werden kann.
UML-Diagramm:
Code-Implementierung:
<?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(); /*张三在吃饭 张三在跑步*/ ?>
Vorteile:
Der Proxy-Modus kann den Anrufer und den Angerufenen koordinieren und so die Kopplung des Systems bis zu einem gewissen Grad reduzieren. Der Remote-Proxy ermöglicht dem Client den Zugriff auf Objekte auf dem Remote-Computer. Der Remote-Computer verfügt möglicherweise über eine bessere Rechenleistung und Verarbeitungsgeschwindigkeit und kann schnell auf Client-Anfragen reagieren und diese verarbeiten.
Durch die Verwendung eines kleinen Objekts zur Darstellung eines großen Objekts kann der virtuelle Agent den Verbrauch von Systemressourcen reduzieren, das System optimieren und die Laufgeschwindigkeit erhöhen.
Schutzagenten können den Zugriff auf reale Objekte kontrollieren.
Nachteile:
Die Implementierung von Proxy-Mustern erfordert zusätzliche Arbeit und die Implementierung einiger Proxy-Muster ist sehr komplex.
Anwendbare Szenarien:
1. Remote-Proxy (Remote-Proxy): Stellt Dienste für ein Objekt bereit, das sich an einem anderen Ort befindet Adressraum Ein lokales Proxy-Objekt. Dieser unterschiedliche Adressraum kann sich auf demselben Host oder einem anderen Host befinden. Der Remote-Proxy wird auch als Ambassador bezeichnet.
2. Virtueller Proxy: Wenn Sie ein Objekt erstellen müssen, das eine große Menge an Ressourcen verbraucht, erstellen Sie zunächst ein Objekt, das relativ wenig Ressourcen verbraucht, um es darzustellen. Das reale Objekt wird nur bei Bedarf erstellt.
3. Copy-on-Write-Agent: Hierbei handelt es sich um eine Art virtueller Agent, der den Kopiervorgang (Klonvorgang) verzögert, bis er nur dann ausgeführt wird, wenn der Client ihn wirklich benötigt. Im Allgemeinen ist das tiefe Klonen eines Objekts ein teurer Vorgang. Der Copy-on-Write-Proxy kann diesen Vorgang verzögern und das Objekt wird nur dann geklont, wenn es verwendet wird.
4. Schutzagent (Schützen oder Zugriff): Steuert den Zugriff auf ein Objekt und kann verschiedenen Benutzern unterschiedliche Ebenen von Nutzungsberechtigungen gewähren.
5. Cache-Agent: Stellt temporären Speicherplatz für die Ergebnisse eines bestimmten Zielvorgangs bereit, sodass mehrere Clients diese Ergebnisse gemeinsam nutzen können.
6. Firewall-Agent: Schützen Sie das Ziel vor böswilligen Benutzern.
7. Synchronisationsagent: Ermöglicht mehreren Benutzern die gleichzeitige Nutzung eines Objekts ohne Konflikte.
8. Intelligenter Referenzagent: Wenn auf ein Objekt verwiesen wird, stellt er einige zusätzliche Operationen bereit, z. B. die Aufzeichnung der Häufigkeit, mit der dieses Objekt aufgerufen wird usw.
几种常用的代理模式:
1、图片代理:一个很常见的代理模式的应用实例就是对大图浏览的控制。
用户通过浏览器访问网页时先不加载真实的大图,而是通过代理对象的方法来进行处理,在代理对象的方法中,先使用一个线程向客户端浏览器加载一个小图片,然后在后台使用另一个线程来调用大图片的加载方法将大图片加载到客户端。当需要浏览大图片时,再将大图片在新网页中显示。如果用户在浏览大图时加载工作还没有完成,可以再启动一个线程来显示相应的提示信息。通过代理技术结合多线程编程将真实图片的加载放到后台来操作,不影响前台图片的浏览。
2、远程代理:远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的远程业务对象是局域的而不是远程的,而远程代理对象承担了大部分的网络通信工作。
3、虚拟代理:当一个对象的加载十分耗费资源的时候,虚拟代理的优势就非常明显地体现出来了。虚拟代理模式是一种内存节省技术,那些占用大量内存或处理复杂的对象将推迟到使用它的时候才创建。
在应用程序启动的时候,可以用代理对象代替真实对象初始化,节省了内存的占用,并大大加速了系统的启动时间。
4、动态代理:动态代理是一种较为高级的代理模式,它的典型应用就是Spring AOP。
在传统的代理模式中,客户端通过Proxy调用RealSubject类的request()方法,同时还在代理类中封装了其他方法(如preRequest()和postRequest()),可以处理一些其他问题。
如果按照这种方法使用代理模式,那么真实主题角色必须是事先已经存在的,并将其作为代理对象的内部成员属性。如果一个真实主题角色必须对应一个代理主题角色,这将导致系统中的类个数急剧增加,因此需要想办法减少系统中类的个数,此外,如何在事先不知道真实主题角色的情况下使用代理主题角色,这都是动态代理需要解决的问题。
另一个例子:
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 '<pre/>'; } private function loadFromDisk($fileName) { print_r("Loading ". $fileName); echo '<pre/>'; } }
(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
<? ( = ('\\','/', .".class.php" = ProxyImage('a.jpg'->
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
Das obige ist der detaillierte Inhalt vonSo implementieren Sie den Proxy-Modus in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!