原文:http://www.runoob.com/design-pattern/proxy-pattern.html


概述:

一个类代表另一个类的功能,这种属于结构性设计模式;主要是为其他对象提供一种代理以控制这个对象的访问。


优点:

1、职责清晰。

2、高扩展性。

3、智能化。

缺点:

1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

使用场景:

按职责来划分,通常有以下使用场景:

1、远程代理。

2、虚拟代理。

3、Copy-on-Write 代理。

4、保护(Protect or Access)代理。

5、Cache代理。

6、防火墙(Firewall)代理。

7、同步化(Synchronization)代理。

8、智能引用(Smart Reference)代理。

注意事项:

1、和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。

2、和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。


代码示例:

proxy_pattern_uml_diagram.jpg

<?php
interface Image{
    public function display();
}

class RealImage implements Image {

    private  $fileName;

    public function RealImage($fileName){
        $this->fileName = fileName;
        $this->loadFromDisk($this->fileName);
    }

    public function display() {
        echo "Displaying " . $this->fileName;
    }

    private function loadFromDisk( $fileName){
        echo "Loading " . $this->fileName;
    }
}

class ProxyImage implements Image{

   private realImage = null;
   private $fileName;

   public function ProxyImage( $fileName){
      $this->fileName = $fileName;
   }

   public function display() {
      if($this->realImage == null){
         $this->realImage = new RealImage($this->fileName);
      }
      $this->realImage->display();
   }
}
$p_w_picpath = new ProxyImage("test_10mb.jpg");
$p_w_picpath->display();