PHP設計模式(7)代理模式

技術小美發表於2017-11-11

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

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

143749651.jpg

參與者

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

主體(Subject):RealSubject的抽象;

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
//定義介面
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);


本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1346236,如需轉載請自行聯絡原作者


相關文章