指令鍊 模式以松散耦合主題為基礎,發送消息、指令和請求,或通過一組處理程式發送任意内容。每個處理程式都會自行判斷自己能否處理請求。如果可以,該請求被處理,程序停止。您可以為系統添加或移除處理程式,而不影響其他處理程式。
以下代碼顯示了此模式的一個示例。
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><?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>->_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>->_commands </code><code>as</code> <code>$cmd</code><code>) {</code>
<code>if</code><code>(</code><code>$cmd</code><code>->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<br>'</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<br>'</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>->addCommand(</code><code>$user</code><code>);</code>
<code>$commandChain</code><code>->addCommand(</code><code>$mail</code><code>);</code>
<code>//執行指令</code>
<code>$commandChain</code><code>->runCommand(</code><code>'addUser'</code><code>,null);</code>
<code>$commandChain</code><code>->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,如需轉載請自行聯系原作者