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进阶教程,全系列!架构

内容不错的话但愿你们支持鼓励下点个赞/喜欢,欢迎一块儿来交流;另外若是有什么问题 建议 想看的内容能够在评论提出

相关文章
相关标签/搜索