PHP設計模式漫談之命令模式
原創【51CTO獨家特稿】PHP設計模式漫談我們已經連載了四期,我們知道了代理模式、責任鏈模式和結構模式;今天我們一起來討論的是命令模式(Command),命令模式是封裝一個通用操作的機制。
欲了解更多關于PHP設計模式的內容,歡迎訪問:PHP設計模式漫談
如果你熟悉C或PHP,你可能已經遇到過Command,它相當于程序中的:回調(callback)?;卣{通常使用一個函數指針或數據結構如PHP中的字符串和數組實現,Command是在一個方法調用之上的抽象,它吸收了所有面向對象的好處:合成、繼承和處理。
例如,《設計模式》一書推薦使用Command存儲用戶行為鏈,以支持撤銷和重做操作。
注意PHP 5.3函數編程能力(閉包)可以被當做Command模式的一個本地實現,但為每一個命令層次結構使用抽象數據類型有助于類型安全。
PHP設計模式中的命令模式
在這個模式中,Invoker(調用者)知道傳遞給它的Command,無需依賴于真實的ConcreteCommand(具體的命令)實現,解決了通過配置進行方法調用相關的問題,如UI控件按鈕和菜單等引用一個Command,它們的行為是通過通用的ConcreteCommand實例呈現的。
參與者:
◆Command(命令):在一個方法調用之上定義一個抽象;
◆ConcreteCommand(具體的命令):一個操作的實現;
◆Invoker(調用者):引用Command實例作為它可用的操作。
下面的代碼展示了Validator組件作為Command對象實現的示例:
- /**
- * The Command abstraction.
- * In this case the implementation must return a result,
- * sometimes it only has side effects.
- */
- interface Validator
- {
- /**
- * The method could have any parameters.
- * @param mixed
- * @return boolean
- */
- public function isValid($value);
- }
- /**
- * ConcreteCommand.
- */
- class MoreThanZeroValidator implements Validator
- {
- public function isValid($value)
- {
- return $value > 0;
- }
- }
- /**
- * ConcreteCommand.
- */
- class EvenValidator implements Validator
- {
- public function isValid($value)
- {
- return $value % 2 == 0;
- }
- }
- /**
- * The Invoker. An implementation could store more than one
- * Validator if needed.
- */
- class ArrayProcessor
- {
- protected $_rule;
- public function __construct (Validator $rule)
- {
- $this->_rule = $rule;
- }
- public function process(array $numbers)
- {
- foreach ($numbers as $n) {
- if ($this->_rule->IsValid($n)) {
- echo $n, "\n";
- }
- }
- }
- }
- // Client code
- $processor = new ArrayProcessor(new EvenValidator());
- $processor->process(array(1, 20, 18, 5, 0, 31, 42));
使用PHP設計模式中的命令模式的一些注意事項:
◆方法調用中的某些參數可以在構造ConcreteCommand時提供,有效地局部套用(currying)原始函數;
◆一個Command可以被看作是一個非常簡單的只有一個方法的策略(Strategy),重點放在對象的操作上;
◆ConcreteCommands也要組織它們需要的每一個資源,以實現它們的目標,主要是行為的Receiver(接受者),它們調用方法執行一個Command;
◆復合模式,裝飾模式和其它模式都可以和命令模式組合,獲得更多的Command,裝飾Command等等。
【編輯推薦】