为昂贵或者没法复制的资源提供接口。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)。网络
内容不错的话但愿你们支持鼓励下点个赞/喜欢,欢迎一块儿来交流;另外若是有什么问题 建议 想看的内容能够在评论提出