天天看點

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

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>&lt;?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>-&gt;_width;</code>

<code>public</code> <code>function</code> <code>getHeight(){</code>

<code>return</code> <code>$this</code><code>-&gt;_height;</code>

<code>public</code> <code>function</code> <code>getPath(){</code>

<code>return</code> <code>$this</code><code>-&gt;_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>-&gt;_path = </code><code>$path</code><code>;</code>

<code>list(</code><code>$this</code><code>-&gt;_width,</code><code>$this</code><code>-&gt;_height) = </code><code>getimagesize</code><code>(</code><code>$path</code><code>);</code>

<code>$this</code><code>-&gt;_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>-&gt;_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>-&gt;_realImage === null) {</code>

<code>$this</code><code>-&gt;_realImage = </code><code>new</code> <code>RawImage(</code><code>$this</code><code>-&gt;_path);</code>

<code>$this</code><code>-&gt;_layzLoad();</code>

<code>return</code> <code>$this</code><code>-&gt;_realImage-&gt;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>-&gt;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>-&gt;tag(</code><code>$proxy</code><code>);</code>

<code></code>

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