定義
給某一個物件提供一個代理物件,並由代理物件來控制對原物件的訪問。
設計的原則和思想
- 解耦的是代理者與被代理者。
- 不變部分是代理者,變化部分是被代理者。
- 核心思想是在不改變物件的情況下,為物件增加一些與本身業務沒什麼關係的額外功能,但不會為物件本身的功能進行增強。
一句話概括設計模式
透過代理的方式去控制對一個物件的訪問
結構中包含的角色
- Subject(抽象主題角色)
- Proxy(代理主題角色)
- RealSubject(真實主題角色)
最小可表達程式碼
interface Subject {
public function request();
}
class RealSubject implements Subject
{
public function request()
{
echo '真實物件執行';
}
}
class Proxy implements Subject
{
private $realSubject;
public function __construct()
{
$this->realSubject = new RealSubject();
}
public function request()
{
$this->realSubject->request();
}
}
$proxy = new Proxy();
$proxy->request();
優點
- 替換代理類不用修改程式碼。
- 在呼叫者和被呼叫者之間增加了代理物件,降低了系統的耦合度。
缺點
- 增加代理物件可能會對有些代理模式的請求的處理速度變慢,例如保護代理。
- 有些代理模式實現程式碼比較複雜,例如遠端代理。
何時使用
- 限制、增強或修改某個物件的一些特性。
- 無法直接訪問某個物件或訪問某個物件存在困難時時。
- 為某個物件增加一些與本身業務沒什麼關係的額外功能時。
- 需要延遲載入資源時。
實際應用場景
- 監控
- 快取
- 限流
- 日誌
- 統計
- 在12306買票。
- 訪問許可權控制。
- 透過中介去找房子。
- RPC框架,遠端代理。
- Spring AOP 動態代理。
靜態代理和靜態代理
靜態 : 由我們編寫的代理類。
動態 : 在程式執行時,透過反射機制動態生成。
本作品採用《CC 協議》,轉載必須註明作者和本文連結