欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP設(shè)計(jì)模式之代理模式的深入解析

 更新時(shí)間:2013年06月13日 15:49:15   作者:  
本篇文章是對(duì)PHP設(shè)計(jì)模式中的代理模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

代理模式(Proxy),它是對(duì)簡(jiǎn)單處理程序(或指針)的增強(qiáng),用于引用一個(gè)對(duì)象:這個(gè)指針被代理(Proxy)對(duì)象取代,代理對(duì)象位于客戶端(Client)和真實(shí)執(zhí)行程序之間,指針有一個(gè)可被多個(gè)目標(biāo)利用的鉤子。

從技術(shù)上講,這種模式在客戶端和真實(shí)主體(RealSubject)之間插入一個(gè)代理對(duì)象,維護(hù)subject接口和用不同的方式委派它的方法。代理可以透明地做任何事情:懶散創(chuàng)建RealSubject或載入數(shù)據(jù),與其它機(jī)器交換消息,寫時(shí)復(fù)制策略等。這與HTTP代理有點(diǎn)類似,其客戶端(如瀏覽器)和應(yīng)用程序依賴于與HTTP服務(wù)器的聯(lián)系,代理在管理連接時(shí)可以完成其它任務(wù),如訪問(wèn)控制和緩存大型下載文件。


代理模式的對(duì)象圖與裝飾模式對(duì)象圖在結(jié)構(gòu)上類似,但表達(dá)的目的各有不同,裝飾者給對(duì)象動(dòng)態(tài)增加行為,而代理則控制來(lái)自客戶端的訪問(wèn)。此外,代理只在需要時(shí)才創(chuàng)建RealSubject。

參與者:
◆客戶端(Client):取決于主體(Subject)實(shí)現(xiàn);
◆主體(Subject):RealSubject的抽象;
◆真實(shí)主體(RealSubject):完成代價(jià)高昂的工作或包含大量的數(shù)據(jù);
◆代理(Proxy):為Client提供一個(gè)與Subject一致的引用,僅在需要時(shí)才創(chuàng)建RealSubject實(shí)例或與RealSubject實(shí)例通信。

下面是兩個(gè)被廣泛使用的代理模式例子:
1、對(duì)象-關(guān)系映射(Orms)在運(yùn)行中創(chuàng)建代理作為實(shí)體類的子類,以實(shí)現(xiàn)懶散加載(虛擬代理),這個(gè)代理會(huì)覆蓋所有實(shí)體方法,在前面追加一個(gè)載入程序,在方法被真正調(diào)用前不會(huì)包含任何數(shù)據(jù),Orms代理支持對(duì)象間的雙向關(guān)系,不用加載整個(gè)數(shù)據(jù)庫(kù),因?yàn)樗鼈儽恢糜诋?dāng)前加載對(duì)象圖的邊界。

2、Java RMI使用遠(yuǎn)程代理對(duì)象(遠(yuǎn)程代理),當(dāng)它們的方法被調(diào)用時(shí),代理序列化參數(shù),執(zhí)行網(wǎng)絡(luò)上的請(qǐng)求,委托調(diào)用另一個(gè)節(jié)點(diǎn)上的真實(shí)對(duì)象,這種技術(shù)允許透明地調(diào)用遠(yuǎn)程對(duì)象,不用擔(dān)心它們是否在同一臺(tái)機(jī)器上,但這種透明度很容易會(huì)使執(zhí)行速度變慢。

下面的代碼示例實(shí)現(xiàn)了一個(gè)ImageProxy,推遲了圖像數(shù)據(jù)的加載。

復(fù)制代碼 代碼如下:

/** 
 * Subject interface. 
 * Client depends only on this abstraction. 
 */
interface Image 

    public function getWidth(); 

    public function getHeight(); 

    public function getPath(); 

    /** 
     * @return string   the image's byte stream 
     */
    public function dump(); 


/** 
 * Abstract class to avoid repetition of boilerplate code in the Proxy 
 * and in the Subject. Only the methods which can be provided without 
 * instancing the RealSubject are present here. 
 */
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; 
    } 


/** 
 * The RealSubject. Always loads the image, even if no dump of the data 
 * is required. 
 */
class RawImage extends AbstractImage 

    public function __construct($path) 
    { 
 $this->_path = $path; 
 list ($this->_width, $this->_height) = getimagesize($path); 
 $this->_data = file_get_contents($path); 
    } 

    public function dump() 
    { 
 return $this->_data; 
    } 


/** 
 * Proxy. Defers loading the image data until it becomes really mandatory. 
 * This class does its best to postpone the very expensive operations 
 * such as the actual loading of the BLOB. 
 */
class ImageProxy extends AbstractImage 

    public function __construct($path) 
    { 
 $this->_path = $path; 
 list ($this->_width, $this->_height) = getimagesize($path); 
    } 

    /** 
     * Creates a RawImage and exploits its functionalities. 
     */
    protected function _lazyLoad() 
    { 
 if ($this->_realImage === null) { 
     $this->_realImage = new RawImage($this->_path); 
 } 
    } 

    public function dump() 
    { 
 $this->_lazyLoad(); 
 return $this->_realImage->dump(); 
    } 


/** 
 * Client class that does not use the data dump of the image. 
 * Passing blindly a Proxy to this class and to other Clients makes sense 
 * as the data would be loaded anyway when Image::dump() is called. 
 */
class Client 

    public function tag(Image $img) 
    { 
 return '; 
    } 


$path = '/home/giorgio/shared/Immagini/kiki.png'; 
$client = new Client(); 

$image = new RawImage($path); // loading of the BLOB takes place 
echo $client->tag($image), "\n"; 

$proxy = new ImageProxy($path); 
echo $client->tag($proxy), "\n"; // loading does not take place even here

以上代碼實(shí)現(xiàn)了PHP的代理模式。簡(jiǎn)單來(lái)講,代理模式就是為其他對(duì)象提供一個(gè)代理以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。

相關(guān)文章

  • PHP實(shí)現(xiàn)事件機(jī)制的方法

    PHP實(shí)現(xiàn)事件機(jī)制的方法

    這篇文章主要介紹了PHP實(shí)現(xiàn)事件機(jī)制的方法,實(shí)例分析了php針對(duì)事件機(jī)制的定義與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • php中的常用魔術(shù)方法總結(jié)

    php中的常用魔術(shù)方法總結(jié)

    以下是對(duì)php中的常用魔術(shù)方法進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • PHP獲取數(shù)組表示的路徑方法分析【數(shù)組轉(zhuǎn)字符串】

    PHP獲取數(shù)組表示的路徑方法分析【數(shù)組轉(zhuǎn)字符串】

    這篇文章主要介紹了PHP獲取數(shù)組表示的路徑,結(jié)合實(shí)例形式對(duì)比分析了數(shù)組轉(zhuǎn)字符串的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • 在Linux系統(tǒng)的服務(wù)器上隱藏PHP版本號(hào)的方法

    在Linux系統(tǒng)的服務(wù)器上隱藏PHP版本號(hào)的方法

    這篇文章主要介紹了在Linux系統(tǒng)的服務(wù)器上隱藏PHP版本號(hào)的方法,有助于預(yù)防攻擊者針對(duì)PHP詳細(xì)版本的漏洞而發(fā)起的攻擊,需要的朋友可以參考下
    2015-06-06
  • 基于PHP常用字符串的總結(jié)(待續(xù))

    基于PHP常用字符串的總結(jié)(待續(xù))

    本篇文章是對(duì)PHP常用的字符串進(jìn)行了詳細(xì)的總結(jié)分析,需要的朋友參考下
    2013-06-06
  • PHP內(nèi)存溢出的解決方法詳解

    PHP內(nèi)存溢出的解決方法詳解

    內(nèi)存溢出是指應(yīng)用系統(tǒng)中存在無(wú)法回收的內(nèi)存或使用的內(nèi)存過(guò)多,最終使得程序運(yùn)行要用到的內(nèi)存大于虛擬機(jī)能提供的最大內(nèi)存。本文為大家總結(jié)了PHP內(nèi)存溢出的解決方法,需要的可以參考一下
    2022-07-07
  • phpMyAdmin2.11.6安裝配置方法

    phpMyAdmin2.11.6安裝配置方法

    今天調(diào)試PHP數(shù)據(jù)庫(kù)Mysql,在單位的電腦上安裝phpMyAdmin數(shù)據(jù)庫(kù)管理軟件,本來(lái)是很簡(jiǎn)單的事,卻出現(xiàn)了幾個(gè)問(wèn)題:1/無(wú)法載入mcrypt擴(kuò)展,請(qǐng)檢查PHP配置;/配置文件現(xiàn)在需要絕密的短語(yǔ)密碼(blowfish_secret);3/#2003-服務(wù)器沒(méi)有響應(yīng)。
    2008-08-08
  • php miniBB中文亂碼問(wèn)題解決方法

    php miniBB中文亂碼問(wèn)題解決方法

    miniBB因?yàn)楹?jiǎn)約而美麗,但國(guó)內(nèi)使用人數(shù)極少, 好多人都是因?yàn)橹形膩y碼而放棄
    2008-11-11
  • Php中用PDO查詢Mysql來(lái)避免SQL注入風(fēng)險(xiǎn)的方法

    Php中用PDO查詢Mysql來(lái)避免SQL注入風(fēng)險(xiǎn)的方法

    本篇文章介紹了,Php中用PDO查詢Mysql來(lái)避免SQL注入風(fēng)險(xiǎn)的方法。需要的朋友參考下
    2013-04-04
  • PHP與Web頁(yè)面的交互示例詳解一

    PHP與Web頁(yè)面的交互示例詳解一

    這篇文章主要介紹了PHP與Web頁(yè)面的交互示例詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評(píng)論