### 定义
给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
### 作用
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
### 使用场景
房东托中介卖房。
### 优、缺点
优点:
1、职责清晰。
2、高扩展性。
3、智能化。
缺点:
1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。
2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。
### 模式结构
(略)
### 示例类图
代理模式包含几个角色:
* Subject:抽象主题接口,定义了RealSubject和Proxy公用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
* RealSubject:真正主题类,定义了Proxy所代表的真实实体。
* Proxy:代理对象,保存一个引用使得代理可以访问实体,并提供一个与RealSubject接口相同的接口,这样代理可以用来代替实体(RealSubject)。
:-: ![](https://box.kancloud.cn/253ae35d05c0cdd9e6d23b6b94af1ca7_518x258.bmp)
### 示例代码
* 抽象主题接口 (Subject)
```
/**
* 房屋交易接口
*/
interface HousingTransactions
{
public function sell();
}
```
* 真正主题类 (RealSubject)
```
/**
* 房东卖房子
*/
class Seller implements HousingTransactions
{
public $name;
public function __construct($name) {
$this->name = $name;
}
public function sell() {
echo $this->name."卖房子\n";
}
}
```
* 代理对象(Proxy)
```
/**
* 房产中介
*/
class Proxy implements HousingTransactions
{
private $_subject = null;
public function __construct($name) {
$this->_subject = new Seller($name);
}
public function sell() {
$this->_subject->sell();
}
}
```
* 客户端调用
```
class Client
{
public static function main($argv)
{
$proxy = new Proxy('张三'); // 找中介帮忙卖房子
$proxy->sell();
$proxy = new Proxy('李四');
$proxy->sell();
}
}
Client::main($argv);
```
* 运行结果
```
张三卖房子
李四卖房子
```
* * * * *
### 注意事项
1. 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
2. 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制。