PHP設(shè)計模式之命令模式的深入解析
命令模式(Command),命令模式是封裝一個通用操作的機制。
如果你熟悉C或PHP,你可能已經(jīng)遇到過Command,它相當(dāng)于程序中的:回調(diào)(callback)。回調(diào)通常使用一個函數(shù)指針或數(shù)據(jù)結(jié)構(gòu)如PHP中的字符串和數(shù)組實現(xiàn),Command是在一個方法調(diào)用之上的抽象,它吸收了所有面向?qū)ο蟮暮锰帲汉铣?、繼承和處理。
例如,《設(shè)計模式》一書推薦使用Command存儲用戶行為鏈,以支持撤銷和重做操作。
注意PHP 5.3函數(shù)編程能力(閉包)可以被當(dāng)做Command模式的一個本地實現(xiàn),但為每一個命令層次結(jié)構(gòu)使用抽象數(shù)據(jù)類型有助于類型安全。

在這個模式中,Invoker(調(diào)用者)知道傳遞給它的Command,無需依賴于真實的ConcreteCommand(具體的命令)實現(xiàn),解決了通過配置進(jìn)行方法調(diào)用相關(guān)的問題,如UI控件按鈕和菜單等引用一個Command,它們的行為是通過通用的ConcreteCommand實例呈現(xiàn)的。
參與者:
◆Command(命令):在一個方法調(diào)用之上定義一個抽象;
◆ConcreteCommand(具體的命令):一個操作的實現(xiàn);
◆Invoker(調(diào)用者):引用Command實例作為它可用的操作。
下面的代碼展示了Validator組件作為Command對象實現(xiàn)的示例:
/**
* 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設(shè)計模式中的命令模式的一些注意事項:
◆方法調(diào)用中的某些參數(shù)可以在構(gòu)造ConcreteCommand時提供,有效地局部套用(currying)原始函數(shù);
◆一個Command可以被看作是一個非常簡單的只有一個方法的策略(Strategy),重點放在對象的操作上;
◆ConcreteCommands也要組織它們需要的每一個資源,以實現(xiàn)它們的目標(biāo),主要是行為的Receiver(接受者),它們調(diào)用方法執(zhí)行一個Command;
◆復(fù)合模式,裝飾模式和其它模式都可以和命令模式組合,獲得更多的Command,裝飾Command等等。
相關(guān)文章
強烈聲明: 不要使用(include/require)_once
本篇文章是對不要使用(include/require)_once的原因進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP設(shè)計模式之 策略模式Strategy詳解【對象行為型】
這篇文章主要介紹了PHP設(shè)計模式之 策略模式Strategy,結(jié)合實例形式詳細(xì)分析了PHP基于對象行為型的策略模式Strategy具體原理、實現(xiàn)技巧與相關(guān)操作注意事項,需要的朋友可以參考下2020-05-05PHP使用微信開發(fā)模式實現(xiàn)搜索已發(fā)送圖文及匹配關(guān)鍵字回復(fù)的方法
這篇文章主要介紹了PHP使用微信開發(fā)模式實現(xiàn)搜索已發(fā)送圖文及匹配關(guān)鍵字回復(fù)的方法,涉及php針對微信json格式數(shù)據(jù)的解析與正則匹配相關(guān)操作技巧,需要的朋友可以參考下2017-09-09關(guān)于php連接mssql:pdo odbc sql server
研究了很久,終于發(fā)現(xiàn):最新的php 5.3.6中php_mssql.dll,php_pdo_mssql.dll都已經(jīng)不見了。2011-07-07PHP代碼網(wǎng)站如何防范SQL注入漏洞攻擊建議分享
所有的網(wǎng)站管理員都會關(guān)心網(wǎng)站的安全問題。說到安全就不得不說到SQL注入攻擊(SQL Injection)2012-03-03