試用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']);

這是大略的想法。