天天看點

PHP設計模式(4)指令鍊模式

指令鍊 模式以松散耦合主題為基礎,發送消息、指令和請求,或通過一組處理程式發送任意内容。每個處理程式都會自行判斷自己能否處理請求。如果可以,該請求被處理,程序停止。您可以為系統添加或移除處理程式,而不影響其他處理程式。

以下代碼顯示了此模式的一個示例。

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

<code>&lt;?php</code>

<code>//定義指令接口</code>

<code>interface</code> <code>ICommand {</code>

<code>function</code> <code>onCommand(</code><code>$name</code><code>,</code><code>$args</code><code>);</code>

<code>}</code>

<code>//定義維護指令對象清單的類</code>

<code>class</code> <code>CommandChain {</code>

<code>//定義對象清單數組</code>

<code>private</code> <code>$_commands</code> <code>= </code><code>array</code><code>();</code>

<code>//定義添加指令方法</code>

<code>public</code> <code>function</code> <code>addCommand(</code><code>$cmd</code><code>){</code>

<code>$this</code><code>-&gt;_commands[] = </code><code>$cmd</code><code>;</code>

<code>//定義執行指令的方法</code>

<code>public</code> <code>function</code> <code>runCommand(</code><code>$name</code><code>,</code><code>$args</code><code>){</code>

<code>foreach</code><code>(</code><code>$this</code><code>-&gt;_commands </code><code>as</code> <code>$cmd</code><code>) {</code>

<code>if</code><code>(</code><code>$cmd</code><code>-&gt;onCommand(</code><code>$name</code><code>,</code><code>$args</code><code>)){</code>

<code>return</code><code>;</code>

<code>//定義一個添加使用者的指令對象</code>

<code>class</code> <code>UserCommand </code><code>implements</code> <code>ICommand {</code>

<code>public</code> <code>function</code> <code>onCommand(</code><code>$name</code><code>,</code><code>$args</code><code>){</code>

<code>if</code><code>(</code><code>$name</code> <code>!= </code><code>'addUser'</code><code>){</code>

<code>return</code> <code>false;</code>

<code>echo</code> <code>'UserCommand run command addUser&lt;br&gt;'</code><code>;</code>

<code>//定義一個發送郵件的指令對象</code>

<code>class</code> <code>MailCommand </code><code>implements</code> <code>ICommand {</code>

<code>if</code><code>(</code><code>$name</code> <code>!= </code><code>'mail'</code><code>){</code>

<code>echo</code> <code>'MailCommand run command mail&lt;br&gt;'</code><code>;</code>

<code>$commandChain</code> <code>= </code><code>new</code> <code>CommandChain();</code>

<code>//執行個體化指令對象</code>

<code>$user</code> <code>= </code><code>new</code> <code>UserCommand();</code>

<code>$mail</code> <code>= </code><code>new</code> <code>MailCommand();</code>

<code>//添加指令對象到清單中</code>

<code>$commandChain</code><code>-&gt;addCommand(</code><code>$user</code><code>);</code>

<code>$commandChain</code><code>-&gt;addCommand(</code><code>$mail</code><code>);</code>

<code>//執行指令</code>

<code>$commandChain</code><code>-&gt;runCommand(</code><code>'addUser'</code><code>,null);</code>

<code>$commandChain</code><code>-&gt;runCommand(</code><code>'mail'</code><code>,null);</code>

此代碼定義維護 <code>ICommand</code> 對象清單的 <code>CommandChain</code> 類。兩個類都可以實作 <code>ICommand</code> 接口 —— 一個對郵件的請求作出響應,另一個對添加使用者作出響應。

如果您運作包含某些測試代碼的腳本,則會得到以下輸出:

<a href="http://blog.51cto.com/attachment/201312/213621694.png" target="_blank"></a>

代碼首先建立 <code>CommandChain</code> 對象,并為它添加兩個指令對象的執行個體。然後運作兩個指令以檢視誰對這些指令作出了響應。如果指令的名稱不比對 <code>UserCommand</code> 或 <code>MailCommand</code>,則代碼失敗,不發生任何操作。

為處理請求而建立可擴充的架構時,指令鍊模式很有價值,使用它可以解決許多問題。

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