国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

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

2024-05-04 23:09:30
字體:
供稿:網(wǎng)友

代理模式(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ù),如訪問控制和緩存大型下載文件。


代理模式的對(duì)象圖與裝飾模式對(duì)象圖在結(jié)構(gòu)上類似,但表達(dá)的目的各有不同,裝飾者給對(duì)象動(dòng)態(tài)增加行為,而代理則控制來自客戶端的訪問。此外,代理只在需要時(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ù)庫,因?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)單來講,代理模式就是為其他對(duì)象提供一個(gè)代理以控制對(duì)這個(gè)對(duì)象的訪問。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 长阳| 巴彦县| 平昌县| 汉源县| 黎城县| 云安县| 塘沽区| 宝鸡市| 驻马店市| 保德县| 神木县| 娄底市| 定南县| 阜宁县| 格尔木市| 徐闻县| 和政县| 南陵县| 河南省| 灵山县| 杂多县| 通州区| 陵水| 城步| 米易县| 泽库县| 揭西县| 绥宁县| 奉新县| 黑河市| 阿图什市| 鹤山市| 新密市| 四川省| 改则县| 东光县| 鄄城县| 定远县| 顺平县| 沧州市| 和田县|