代理模式是一種結構型設計模式,其核心概念在於「一個角色代表另一個角色採取行動」。就像現實生活中,紅酒廠商不會直接面對零售客戶,而是透過代理商完成銷售;客戶也不必親自尋找工廠,只需聯繫當地代理即可。在軟體設計中,代理模式為某個對象提供一個代理對象,並由代理對象控制對真實對象的引用。
<?php
/**
* 代理模式
* 為其他對象提供一個代理以控制這個對象的訪問
*/
interface Proxy {
public function request();
public function display();
}
class RealSubject {
public function request() {
echo "RealSubject request<br/>";
}
public function display() {
echo "RealSubject display<br/>";
}
}
class ProxySubject implements Proxy {
private $_subject = null;
public function __construct() {
$this->_subject = new RealSubject();
}
public function request() {
// 可在這裡加入前置處理邏輯
$this->_subject->request();
// 可在這裡加入後置處理邏輯
}
public function display() {
$this->_subject->display();
}
}
// 客戶端使用
$objProxy = new ProxySubject();
$objProxy->request();
$objProxy->display();
?>
代理模式透過共同介面,使代理對象能無縫替換真實對象。代理在客戶端與真實對象之間充當中介,可在請求傳遞前進行必要的預處理(如權限檢查、快取讀取、日誌記錄等),降低系統耦合度。
網頁瀏覽時,縮圖先行顯示,點擊後才載入大圖。代理對象負責先顯示縮圖,背景執行緒非同步載入大圖,載入完成後再切換顯示。這完美體現代理模式「控制存取」與「延遲載入」的優勢,不阻塞前台瀏覽體驗。
代理模式適用於需要控制物件存取、增加額外邏輯(如權限、快取、日誌)、或實現延遲初始化的場景。但若濫用會增加系統複雜度,務必確認符合使用條件再引入。