PHP設計模式-代理模式

yifanwu發表於2021-09-09

PHP設計模式中的代理模式(Proxy),它是對簡單處理程式(或指標)的增強,用於引用一個物件:這個指標被代理(Proxy)物件取代,代理物件位於客戶端(Client)和真實執行程式之間,指標有一個可被多個目標利用的鉤子。

從技術上講,這種模式在客戶端和真實主體(RealSubject)之間插入一個代理物件,維護subject介面和用不同的方式委派它的方法

參與者

客戶端(Client):取決於主體(Subject)實現;

主體(Subject):RealSubject的抽象;

真實主體(RealSubject):完成代價高昂的工作或包含大量的資料;

代理(Proxy):為Client提供一個與Subject一致的引用,僅在需要時才建立RealSubject例項或與RealSubject例項通訊。

廣泛使用的代理模式例子:

1、物件-關係對映(Orms)在執行中建立代理作為實體類的子類,以實現懶散載入(虛擬代理),這個代理會覆蓋所有實體方法,在前面追加一個載入程式,在方法被真正呼叫前不會包含任何資料,Orms代理支援物件間的雙向關係,不用載入整個資料庫,因為它們被置於當前載入物件圖的邊界。

感覺好難理解吧,我也不是很理解,看程式碼吧~~~回頭慢慢理解

//定義介面

interface  Image {

public function getWidth();

public function getHeight();

public function getPath();

 

//返回圖片內容

public function dump();

 

}

//抽象類主要是為了程式碼層次,防止重複引用吧

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) = getimagesize($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) = getimagesize($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來輸出image

class Client{

public function tag(Image $img){

return ;

}

}

$path = '/home/jane/下載/0904190.jpg';

$client = new Client();

//_data資料會被載入

$image = new RawImage($path);

echo $client->tag($image);

//_data資料不會被載入

$proxy = new ImageProxy($path);

echo $client->tag($proxy);

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2157/viewspace-2801952/,如需轉載,請註明出處,否則將追究法律責任。

相關文章