PHP設計模式中的代理模式(Proxy),它是對簡單處理程式(或指針)的增強,用于引用一個對象:這個指針被代理(Proxy)對象取代,代理對象位于用戶端(Client)和真實執行程式之間,指針有一個可被多個目标利用的鈎子。
從技術上講,這種模式在用戶端和真實主體(RealSubject)之間插入一個代理對象,維護subject接口和用不同的方式委派它的方法。
<a href="http://blog.51cto.com/attachment/201312/143749651.jpg" target="_blank"></a>
參與者:
◆用戶端(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
<code><?php</code>
<code>//定義接口</code>
<code>interface</code> <code>Image {</code>
<code>public</code> <code>function</code> <code>getWidth();</code>
<code>public</code> <code>function</code> <code>getHeight();</code>
<code>public</code> <code>function</code> <code>getPath();</code>
<code>//傳回圖檔内容</code>
<code>public</code> <code>function</code> <code>dump();</code>
<code>}</code>
<code>//抽象類主要是為了代碼層次,防止重複引用吧</code>
<code>abstract</code> <code>class</code> <code>AbstractImage </code><code>implements</code> <code>Image{</code>
<code>protected</code> <code>$_width</code><code>;</code>
<code>protected</code> <code>$_height</code><code>;</code>
<code>protected</code> <code>$_path</code><code>;</code>
<code>protected</code> <code>$_data</code><code>;</code>
<code>public</code> <code>function</code> <code>getWidth(){</code>
<code>return</code> <code>$this</code><code>->_width;</code>
<code>public</code> <code>function</code> <code>getHeight(){</code>
<code>return</code> <code>$this</code><code>->_height;</code>
<code>public</code> <code>function</code> <code>getPath(){</code>
<code>return</code> <code>$this</code><code>->_path;</code>
<code>//真實主體</code>
<code>class</code> <code>RawImage </code><code>extends</code> <code>AbstractImage{</code>
<code>public</code> <code>function</code> <code>__construct(</code><code>$path</code><code>){</code>
<code>$this</code><code>->_path = </code><code>$path</code><code>;</code>
<code>list(</code><code>$this</code><code>->_width,</code><code>$this</code><code>->_height) = </code><code>getimagesize</code><code>(</code><code>$path</code><code>);</code>
<code>$this</code><code>->_data = </code><code>file_get_contents</code><code>(</code><code>$path</code><code>);</code>
<code>public</code> <code>function</code> <code>dump(){</code>
<code>return</code> <code>$this</code><code>->_data;</code>
<code>//代理</code>
<code>class</code> <code>ImageProxy </code><code>extends</code> <code>AbstractImage{</code>
<code>public</code> <code>function</code> <code>__construct(</code><code>$path</code><code>) {</code>
<code>protected</code> <code>function</code> <code>_layzLoad(){</code>
<code>if</code><code>(</code><code>$this</code><code>->_realImage === null) {</code>
<code>$this</code><code>->_realImage = </code><code>new</code> <code>RawImage(</code><code>$this</code><code>->_path);</code>
<code>$this</code><code>->_layzLoad();</code>
<code>return</code> <code>$this</code><code>->_realImage->dump();</code>
<code>//Client類比沒有使用_data來輸出image</code>
<code>class</code> <code>Client{</code>
<code>public</code> <code>function</code> <code>tag(Image </code><code>$img</code><code>){</code>
<code>return</code> <code>;</code>
<code>$path</code> <code>= </code><code>'/home/jane/下載下傳/0904190.jpg'</code><code>;</code>
<code>$client</code> <code>= </code><code>new</code> <code>Client();</code>
<code>//_data資料會被加載</code>
<code>$image</code> <code>= </code><code>new</code> <code>RawImage(</code><code>$path</code><code>);</code>
<code>echo</code> <code>$client</code><code>->tag(</code><code>$image</code><code>);</code>
<code>//_data資料不會被加載</code>
<code>$proxy</code> <code>= </code><code>new</code> <code>ImageProxy(</code><code>$path</code><code>);</code>
<code>echo</code> <code>$client</code><code>->tag(</code><code>$proxy</code><code>);</code>
<code></code>
本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1346236,如需轉載請自行聯系原作者