### 定義
給某一個對象提供一個代理對象,并由代理對象控制對原對象的引用。
### 作用
為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。
### 使用場景
房東托中介賣房。
### 優、缺點
優點:
1、職責清晰。
2、高擴展性。
3、智能化。
缺點:
1、由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。
2、實現代理模式需要額外的工作,有些代理模式的實現非常復雜。
### 模式結構
(略)
### 示例類圖
代理模式包含幾個角色:
* Subject:抽象主題接口,定義了RealSubject和Proxy公用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。
* RealSubject:真正主題類,定義了Proxy所代表的真實實體。
* Proxy:代理對象,保存一個引用使得代理可以訪問實體,并提供一個與RealSubject接口相同的接口,這樣代理可以用來代替實體(RealSubject)。
:-: 
### 示例代碼
* 抽象主題接口 (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. 和裝飾器模式的區別:裝飾器模式為了增強功能,而代理模式是為了加以控制。