目的
為昂貴或者無法復制的資源提供介面,
代理模式(Proxy)為其他物件提供一種代理以控制對這個物件的訪問,使用代理模式創建代理物件,讓代理物件控制目標物件的訪問(目標物件可以是遠程的物件、創建開銷大的物件或需要安全控制的物件),并且可以在不改變目標物件的情況下添加一些額外的功能,
在某些情況下,一個客戶不想或者不能直接參考另一個物件,而代理物件可以在客戶端和目標物件之間起到中介的作用,并且可以通過代理物件去掉客戶不能看到的內容和服務或者添加客戶需要的額外服務,
經典例子就是網路代理,你想訪問 Facebook 或者 Twitter ,如何繞過 GFW?找個代理網站,
例子
- Doctrine2 使用代理來實作框架特性(如延遲初始化),同時用戶還是使用自己的物體類并且不會使用或者接觸到代理
UML圖

★官方PHP高級學習交流社群「點擊」管理整理了一些資料,BAT等一線大廠進階知識體系備好(相關學習資料以及筆面試題)以及不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨
代碼
- Record.php
<?php
namespace DesignPatterns\Structural\Proxy;
/**
* @property 用戶名
*/
class Record
{
/**
* @var string[]
*/
private $data;
/**
* @param string[] $data
*/
public function __construct(array $data = https://www.cnblogs.com/phpyu/p/[])
{
$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];
}
}
- RecordProxy.php
<?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 = https://www.cnblogs.com/phpyu/p/[];
$proxy = new RecordProxy($data);
$proxy->xyz = false;
$this->assertTrue($proxy->xyz===false);
}
}
PHP 互聯網架構師成長之路*「設計模式」終極指南
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)
面試10家公司,識訓9個offer,2020年PHP 面試問題
★如果喜歡我的文章,想與更多資深開發者一起交流學習的話,獲取更多大廠面試相關技術咨詢和指導,歡迎加入我們的群啊,暗號:phpzh(君羊號碼856460874),
2020年最新PHP進階教程,全系列!

內容不錯的話希望大家支持鼓勵下點個贊/喜歡,歡迎一起來交流;另外如果有什么問題 建議 想看的內容可以在評論提出
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/60948.html
標籤:PHP
