1. 概念

    构建了透明置于两个不同对象之内的一个对象,从而能够截取或代理这两个对象间的通信或访问。

  2. 应用场景

    • 远程代理:也就是为了一个对象在不同地址空间提供局部代表。隐藏一个对象存在于不同地址空间的事实。
    • 虚拟代理:根据需求来创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
    • 安全代理:用来控制真实对象的访问对象。
    • 智能指引:当调用真实对象的时候,代理处理一些事情。
<?php
//真实类
interface Subject
{
    public function request();
}

class RealSubject implements Subject
{
    public function request()
    {
        echo '真实的操作';
    }
}

//代理模式代理真实类
class Proxy implements Subject
{
    protected $realSubject;
    public function __construct()
    {
        $this->realSubject = new RealSubject();
    }

    public function request()
    {
        echo '代理操作';
        $this->realSubject->request();
    }
}

//客户端
$proxy = new Proxy();
$proxy->request();
  1. 注意事项
    • 代理模式的实现其实非常简单,或许你在不经意间经常会用到
    • 请注意代理模式与装饰器、适配器的区别
      • 装饰器:一般是对对象进行装饰,其中的方法行为会有增加,以修饰对象为主
      • 适配器:一般会改变方法行为,目的是保持接口的统一但得到不同的实现
      • 代理模式有几种形式:远程代理(例如:第三方接口SDK)、虚代理(例如:异步加载图片)、保护代理&智能指引(例如:权限保护),而我们代码实现的最普通的代理,其实就是让代理类来代替真实类的操作