PHP設計模式之代理模式(Proxy)代碼實例大全(19)

目的

爲昂貴或者沒法複製的資源提供接口。php

代理模式(Proxy)爲其餘對象提供一種代理以控制對這個對象的訪問。使用代理模式建立代理對象,讓代理對象控制目標對象的訪問(目標對象能夠是遠程的對象、建立開銷大的對象或須要安全控制的對象),而且能夠在不改變目標對象的狀況下添加一些額外的功能。laravel

在某些狀況下,一個客戶不想或者不能直接引用另外一個對象,而代理對象能夠在客戶端和目標對象之間起到中介的做用,而且能夠經過代理對象去掉客戶不能看到的內容和服務或者添加客戶須要的額外服務。面試

經典例子就是網絡代理,你想訪問 Facebook 或者 Twitter ,如何繞過 GFW?找個代理網站。sql

例子

  • Doctrine2 使用代理來實現框架特性(如延遲初始化),同時用戶仍是使用本身的實體類而且不會使用或者接觸到代理

UML圖

★官方PHP高級學習交流社羣「點擊」管理整理了一些資料,BAT等一線大廠進階知識體系備好(相關學習資料以及筆面試題)以及不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨shell

代碼

  • Record.php
<?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];
    }
}
  • 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 = [];
            $proxy = new RecordProxy($data);
            $proxy->xyz = false;
            $this->assertTrue($proxy->xyz===false);
        }
    }

PHP 互聯網架構師成長之路*「設計模式」終極指南設計模式

PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)安全

面試10家公司,收穫9個offer,2020年PHP 面試問題服務器

★若是喜歡個人文章,想與更多資深開發者一塊兒交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入咱們的羣啊,暗號:phpzh(君羊號碼856460874)。網絡

2020年最新PHP進階教程,全系列!架構

內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出

相關文章
相關標籤/搜索