爲昂貴或者沒法複製的資源提供接口。php
代理模式(Proxy)爲其餘對象提供一種代理以控制對這個對象的訪問。使用代理模式建立代理對象,讓代理對象控制目標對象的訪問(目標對象能夠是遠程的對象、建立開銷大的對象或須要安全控制的對象),而且能夠在不改變目標對象的狀況下添加一些額外的功能。laravel
在某些狀況下,一個客戶不想或者不能直接引用另外一個對象,而代理對象能夠在客戶端和目標對象之間起到中介的做用,而且能夠經過代理對象去掉客戶不能看到的內容和服務或者添加客戶須要的額外服務。面試
經典例子就是網絡代理,你想訪問 Facebook 或者 Twitter ,如何繞過 GFW?找個代理網站。sql
<?php namespace DesignPatterns\Structural\Proxy; /** * @property 用戶名 */ class Record { /** * @var string[] */ private $data; /** * @param string[] $data */ public function __construct(array $data = []) { $this->data = $data; } /** * @param string $name * @param string $value */ public function __set(string $name, string $value) { $this->data[$name] = $value; } public function __get(string $name): string { if (!isset($this->data[$name])) { throw new \OutOfRangeException('Invalid name given'); } return $this->data[$name]; } }
<?php namespace DesignPatterns\Structural\Proxy; class RecordProxy extends Record { /** * @var bool */ private $isDirty = false; /** * @var bool */ private $isInitialized = false; /** * @param array $data */ public function __construct(array $data) { parent::__construct($data); // 當記錄有數據的時候,將 initialized 標記爲 true , // 由於記錄將保存咱們的業務邏輯,咱們不但願在 Record 類裏面實現這個行爲 // 而是在繼承了 Record 的代理類中去實現。 if (count($data) > 0) { $this->isInitialized = true; $this->isDirty = true; } } /** * @param string $name * @param string $value */ public function __set(string $name, string $value) { $this->isDirty = true; parent::__set($name, $value); } public function isDirty(): bool { return $this->isDirty; } }
<?php namespace DesignPatterns\Structural\Proxy\Tests; use DesignPatterns\Structural\Proxy\Record; use DesignPatterns\Structural\Proxy\RecordProxy; class ProxyTest extends \PHPUnit_Framework_TestCase { public function testSetAttribute(){ $data = []; $proxy = new RecordProxy($data); $proxy->xyz = false; $this->assertTrue($proxy->xyz===false); } }
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)安全
面試10家公司,收穫9個offer,2020年PHP 面試問題服務器
★若是喜歡個人文章,想與更多資深開發者一塊兒交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入咱們的羣啊,暗號:phpzh(君羊號碼856460874)。網絡
內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出