代理模式控制着对原对象的访问,并允许在将请求提交给对象前后进行一些处理。
代码示例
<?php interface subject { public function request(); } //原服务 class realSubject implements subject { public function request() { echo 'realSubject handle request'; } } class proxy implements subject { //申明成员变量,用来存储引用对象 private $realSubject; public function __construct(realSubject $realSubject) { $this->realSubject = $realSubject; } //将请求提交给原对象前后做一些处理 public function request() { if ($this->checkAccess()){ $this->realSubject->request(); $this->logAccess(); } } private function checkAccess() { echo 'proxy check access'; return true; } private function logAccess() { echo 'proxy log access'; } } //客户端调用 $realSubject = new realSubject(); $realSubject->request(); // realSubject handle request $proxy = new proxy($realSubject); $proxy->request(); //1、proxy check access 2、realSubject handle request 3、proxy log access
从示例中可以明显看出,在将请求交给原对象之前,做了 check 操作,请求完了之后,又做了 log 操作。当然,这只是最简单的应用,围绕这一设计,后续可以做一些更加复杂的场景。
适用场景
- 延迟初始化(虚拟代理):对于一个并不常用并且重量级的服务对象,不必要在程序开始就创建该对象,可以将对象的初始化延迟到真正需要的时候。
- 访问控制(保护代理):对于一些重要的服务对象,在调用之前可以针对性的做一些必要的安全校验。
- 记录日志请求(日志记录代理):代理可以在向服务传递请求前进行日志记录和处理结果的记录。
- 缓存请求结果(缓存代理):将请求结果缓存,避免多次请求。
- 智能引用:没有客户端适用某重量级对象时立即销毁该对象。