極簡設計模式-代理模式

long2ge 發表於 2021-12-04
設計模式

定義

給某一個物件提供一個代理物件,並由代理物件來控制對原物件的訪問。 

設計的原則和思想

  1. 解耦的是代理者與被代理者。
  2. 不變部分是代理者,變化部分是被代理者。
  3. 核心思想是在不改變物件的情況下,為物件增加一些與本身業務沒什麼關係的額外功能,但不會為物件本身的功能進行增強。

一句話概括設計模式

通過代理的方式去控制對一個物件的訪問

結構中包含的角色

  1. Subject(抽象主題角色)
  2. Proxy(代理主題角色)
  3. 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();

優點

  1. 替換代理類不用修改程式碼。
  2. 在呼叫者和被呼叫者之間增加了代理物件,降低了系統的耦合度。

缺點

  1. 增加代理物件可能會對有些代理模式的請求的處理速度變慢,例如保護代理。
  2. 有些代理模式實現程式碼比較複雜,例如遠端代理。

何時使用

  1. 限制、增強或修改某個物件的一些特性。
  2. 無法直接訪問某個物件或訪問某個物件存在困難時時。
  3. 為某個物件增加一些與本身業務沒什麼關係的額外功能時。
  4. 需要延遲載入資源時。

實際應用場景

  1. 監控
  2. 快取
  3. 限流
  4. 日誌
  5. 統計
  6. 在12306買票。
  7. 訪問許可權控制。
  8. 通過中介去找房子。
  9. RPC框架,遠端代理。
  10. Spring AOP 動態代理。

靜態代理和靜態代理

靜態 :  由我們編寫的代理類。
動態 : 在程式執行時,通過反射機制動態生成。
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Long2Ge