您好,登錄后才能下訂單哦!
PHP設(shè)計模式中的代理模式(Proxy),它是對簡單處理程序(或指針)的增強,用于引用一個對象:這個指針被代理(Proxy)對象取代,代理對象位于客戶端(Client)和真實執(zhí)行程序之間,指針有一個可被多個目標(biāo)利用的鉤子。
從技術(shù)上講,這種模式在客戶端和真實主體(RealSubject)之間插入一個代理對象,維護subject接口和用不同的方式委派它的方法。
參與者:
◆客戶端(Client):取決于主體(Subject)實現(xiàn);
◆主體(Subject):RealSubject的抽象;
◆真實主體(RealSubject):完成代價高昂的工作或包含大量的數(shù)據(jù);
◆代理(Proxy):為Client提供一個與Subject一致的引用,僅在需要時才創(chuàng)建RealSubject實例或與RealSubject實例通信。
廣泛使用的代理模式例子:
1、對象-關(guān)系映射(Orms)在運行中創(chuàng)建代理作為實體類的子類,以實現(xiàn)懶散加載(虛擬代理),這個代理會覆蓋所有實體方法,在前面追加一個載入程序,在方法被真正調(diào)用前不會包含任何數(shù)據(jù),Orms代理支持對象間的雙向關(guān)系,不用加載整個數(shù)據(jù)庫,因為它們被置于當(dāng)前加載對象圖的邊界。
感覺好難理解吧,我也不是很理解,看代碼吧~~~回頭慢慢理解
<?php //定義接口 interface Image { public function getWidth(); public function getHeight(); public function getPath(); //返回圖片內(nèi)容 public function dump(); } //抽象類主要是為了代碼層次,防止重復(fù)引用吧 abstract class AbstractImage implements Image{ protected $_width; protected $_height; protected $_path; protected $_data; public function getWidth(){ return $this->_width; } public function getHeight(){ return $this->_height; } public function getPath(){ return $this->_path; } } //真實主體 class RawImage extends AbstractImage{ public function __construct($path){ $this->_path = $path; list($this->_width,$this->_height) = getp_w_picpathsize($path); $this->_data = file_get_contents($path); } public function dump(){ return $this->_data; } } //代理 class ImageProxy extends AbstractImage{ public function __construct($path) { $this->_path = $path; list($this->_width,$this->_height) = getp_w_picpathsize($path); } protected function _layzLoad(){ if($this->_realImage === null) { $this->_realImage = new RawImage($this->_path); } } public function dump(){ $this->_layzLoad(); return $this->_realImage->dump(); } } //Client類比沒有使用_data來輸出p_w_picpath class Client{ public function tag(Image $img){ return ; } } $path = '/home/jane/下載/0904190.jpg'; $client = new Client(); //_data數(shù)據(jù)會被加載 $p_w_picpath = new RawImage($path); echo $client->tag($p_w_picpath); //_data數(shù)據(jù)不會被加載 $proxy = new ImageProxy($path); echo $client->tag($proxy);
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。