試用Command Pattern的構想做後台搜尋
Thu, 17 Jan 2008 16:22:09 +0800龐大的switch case常常讓程式不好維護,需要增加新功能時就得去改switch case所在的程式,讓維護比較麻煩。之前看到可以用command pattern來改進這個狀況,所以就用來試一試。
大致的構想如下:
class CommandExecuter { var $command=array(); function addCommand($command,&$obj) { $this->command[$obj->cmdName] =& $obj; } function getAllCommand() { return array_keys($this->command); } function render($command) { $this->command[$command]->render(); } function deal($command) { $this->command[$command]->deal(); } }
上面是主要的程式,用來執行所有表單產生以及回傳搜尋結果。
class Command { var $cmdName=""; function Command ($str) { $this->cmdName = $str; } function render() { 產生表單 echo "<input type='hidden' name='COMMAND' value='".$this->cmdName."'>"; ...... echo "</form>"; } function deal() { 處理表單資料,產生搜尋結果並回傳 } }
以上是實際產生表單以及處理搜尋結果的命令類別。
class CommandAssembler { function getCommandExecuter(){ $tmp = new CommandExecuter(); $tmp->addCommand("search1",new Command("search1")); return $tmp; } }
用這個類別組出完整的設計。
使用方法(產生搜尋表單):
$cmd = CommandAssembler::getCommandExecuter(); $keys = $cmd->getAllCommand(); foreach ($keys as $k) { $cmd->render($k); }
使用方法(產生搜尋結果):
$cmd = CommandAssembler::getCommandExecuter(); $cmd->deal($_POST['COMMAND']);
這是大略的想法。