現(xiàn)在,構(gòu)造函數(shù)增加了第二個可選的參數(shù)用來確定第一個參數(shù)的數(shù)據(jù)類型是數(shù)字類型還是字符串。這個類的最終形式變?yōu)檎埧聪旅娲a,包括了一個‘serialize’ 用來存儲數(shù)據(jù)、對象等復(fù)雜數(shù)據(jù)的存儲類型。
class VarCache { var $_name; var $_type; function VarCache($name, $type=’serialize’) { $this->_name = ‘cache/’.$name; $this->_type = $type; } function isValid() { return file_exists($this->_name.’.php’); } function get() { if ($this->isValid()) { include $this->_name.’.php’; return $cached_content; } } function _getTemplate() { $template = ‘<?php $cached_content = ‘; switch ($this->_type) { case ‘string’: $template .= “‘%s’;”; break; case ‘serialize’: $template .= “unserialize(stripslashes(‘%s’));”; break; case ‘numeric’: $template .= ‘%s;’; break; default: trigger_error(‘invalid cache type’); } return $template; } function set($value) { $file_handle = fopen($this->_name.’.php’, ‘w’); switch ($this->_type) { case ‘string’: $content = sprintf($this->_getTemplate() ,str_replace(“‘“,”\\’”,$value)); break; case ‘serialize’: $content = sprintf($this->_getTemplate() ,addslashes(serialize($value))); break; case ‘numeric’: $content = sprintf($this->_getTemplate() ,(float)$value); break; default: trigger_error(‘invalid cache type’); } fwrite($file_handle, $content);
The Strategy Pattern 131
fclose($file_handle); } }
請注意_getTemplate()和set() 函數(shù)中的case判斷語句。它們都是基于同一個$_type 實例參數(shù)的。get() 函數(shù)中卻沒有受到$_type的影響,所以看起來因為存儲的數(shù)據(jù)類型的變化只影響到數(shù)據(jù)的存儲過程。同時,多重的case條件判斷也是一個提示,這個地方如果使用了策略的設(shè)計模式會更好。
樣本代碼
從一個多重的switch 條件判斷改變到策略模式是一個條件分解實例的經(jīng)典例子。整個測試的環(huán)境沒有變化;只是VarCache類的內(nèi)部改變了。
首先我們把你想要封裝在一個獨立的類的各種情況分隔出來。就前面的例子來說,你有三種變化的情況需要進(jìn)行考慮:‘string’, ‘numeric’, 和第三個‘serialize’。前面的例子中還在對象實例化的時候選擇了數(shù)據(jù)輸出的格式。基于這個運算法則,你需要創(chuàng)建一個API來封裝它。
出處:
責(zé)任編輯:bluehearts
上一頁 php設(shè)計模式介紹之策略模式 [3] 下一頁 php設(shè)計模式介紹之策略模式 [5]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|