中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁(yè) > 技術(shù)文檔 > 網(wǎng)絡(luò)編程 > php設(shè)計(jì)模式介紹之策略模式
php設(shè)計(jì)模式介紹之迭代器模式 回到列表 php設(shè)計(jì)模式介紹之偽對(duì)象模式
 php設(shè)計(jì)模式介紹之策略模式

作者:hosander 時(shí)間: 2008-07-24 文檔類(lèi)型:翻譯 來(lái)自:

第 1 頁(yè) php設(shè)計(jì)模式介紹之策略模式 [1]
第 2 頁(yè) php設(shè)計(jì)模式介紹之策略模式 [2]
第 3 頁(yè) php設(shè)計(jì)模式介紹之策略模式 [3]
第 4 頁(yè) php設(shè)計(jì)模式介紹之策略模式 [4]
第 5 頁(yè) php設(shè)計(jì)模式介紹之策略模式 [5]

你可以用以下的代碼開(kāi)始:

class  CacheWriter  {
function  store($file_handle,  $var)  {
die(‘a(chǎn)bstract  class-implement  in  concrete  CacheWriter’);
}
}

這個(gè)就是PHP4版本的接口。(你可以從這個(gè)類(lèi)進(jìn)行繼承來(lái)保證你使用的是子類(lèi),這樣做的話只是增加了一些系統(tǒng)的負(fù)載。尤其在基類(lèi)CacheWriter是在另外一個(gè)文件定義的時(shí)候。負(fù)載增加得稍微多一些。)

基類(lèi)CacheWriter 調(diào)用了store() 方式函數(shù)來(lái)引入文件處理資源和參數(shù)來(lái)進(jìn)行存儲(chǔ)。每一個(gè)實(shí)際的類(lèi)都從執(zhí)行store()函數(shù), 但是不同的實(shí)例在store()函數(shù)里面使用的運(yùn)算法則是不一樣的,以便不同的數(shù)據(jù)類(lèi)型生成的$cached_content是不同的。每一個(gè)運(yùn)算法則被當(dāng)作一個(gè)單獨(dú)的類(lèi)來(lái)運(yùn)行。

前面的例子中的代碼被替換為:

132

The Strategy Pattern

class  VarCache  {
//  ...
function  _getTemplate()  {
$template  =  ‘<?php  $cached_content  =  ‘;
switch  ($this->_type)  {
case  ‘string’:
$template  .=  “‘%s’;”;
break;
}
//  ...
}
function  set($value)  {
$file_handle  =  fopen($this->_name.’.php’,  ‘w’);
switch  ($this->_type)  {
case  ‘string’:
$content  =  sprintf($this->_getTemplate()
,str_replace(“‘“,”\\’”,$value));
break;
//  ...
}
fwrite($file_handle,  $content);
fclose($file_handle);
}
}

針對(duì)每一個(gè)緩存的數(shù)據(jù)來(lái)型,你需要實(shí)例出相對(duì)應(yīng)的_getTemplate() 和

set() 方式函數(shù)到相對(duì)應(yīng)的類(lèi)當(dāng)中。這里是StringCacheWriter:

class  StringCacheWriter  /*  implements  CacheWriter  */  {
function  store($file_handle,  $string)  {
$content  =  sprintf(
“<?php\n\$cached_content  =  ‘%s’;”
,str_replace(“‘“,”\\’”,$string));
fwrite($file_handle,  $contents);
}
}

(因?yàn)镻HP 4不支持接口的使用,這里接口只是用注釋來(lái)簡(jiǎn)單描述一下。)

這里我們得到另外一個(gè)運(yùn)算法則存儲(chǔ)“策略”。

class  NumericCacheWriter  /*  implements  CacheWriter  */  {
function  store($file_handle,  $numeric)  {
$content  =  sprintf(“<?php\n\$cached_content  =  %s;”
,(double)$numeric);

The Strategy Pattern        133

fwrite($file_handle,  $content);
}
}
class  SerializingCacheWriter  /*  implements  CacheWriter  */  {
function  store($file_handle,  $var)  {
$content  =  sprintf(
“<?php\n\$cached_content  =  unserialize(stripslashes(‘%s’));”
,addslashes(serialize($var)));
fwrite($file_handle,  $content);
}
}

通過(guò)把運(yùn)算法則封裝到交互的類(lèi)中(同樣的API,多形性),你現(xiàn)在可以回過(guò)頭來(lái)通過(guò)策略設(shè)計(jì)模式重新執(zhí)行VarCache()類(lèi)。這個(gè)時(shí)候經(jīng)過(guò)條件分解但是與原來(lái)非常類(lèi)似的代碼可以繼續(xù)運(yùn)行了。

class  VarCache  {
var  $_name;
var  $_type;
function  VarCache($name,  $type=’serialize’)  {
$this->_name  =  ‘cache/’.$name;
switch  (strtolower($type))  {
case  ‘string’:        $strategy  =  ‘String’;         break; case  ‘numeric’:        $strategy  =  ‘Numeric’;        break; case  ‘serialize’:
default:        $strategy  =  ‘Serializing’;
}
$strategy  .=  ‘CacheWriter’;
$this->_type  =&  new  $strategy;
}
function  isValid()  {
return  file_exists($this->_name.’.php’);
}
function  get()  {
if  ($this->isValid())  {
include  $this->_name.’.php’;
return  $cached_content;
}
}
function  set($value)  {
$file_handle  =  fopen($this->_name.’.php’,  ‘w’);
$this->_type->store($file_handle,  $value);
fclose($file_handle);
}
}

通過(guò)創(chuàng)建實(shí)際的CacheWriter 類(lèi)的實(shí)例并讓它幫定實(shí)際的$_type變量,你可以使用  $this->_type->store($file_handle,   $value) 語(yǔ)句來(lái)寫(xiě)入緩存數(shù)據(jù)。

134

The Strategy Pattern

緩存文件的時(shí)候,我們將不再關(guān)心初始化的時(shí)候是用什么運(yùn)算法則來(lái)存儲(chǔ)數(shù)據(jù)。

下面描述了定義策略設(shè)計(jì)模式的幾個(gè)特性:一系列的運(yùn)算法則,每個(gè)運(yùn)算法則都是封裝在獨(dú)立的類(lèi)中。但是,每一個(gè)對(duì)象都是綁定到一個(gè)公共的容器對(duì)象中。并且,通過(guò)一個(gè)公共的API使用同樣的方式在進(jìn)行引用。而這個(gè)公共的API的運(yùn)行方式是與策略的選擇無(wú)關(guān)的。

評(píng)論

策略設(shè)計(jì)模式的功能是非常強(qiáng)大的 。本書(shū)到現(xiàn)在為止所說(shuō)的其它的設(shè)計(jì)模式提供的都是應(yīng)用的基礎(chǔ)模塊功能,而 策略設(shè)計(jì)模式是目前第一個(gè)擁有設(shè)計(jì)模式和項(xiàng)目的遷移里面關(guān)鍵功能的設(shè)計(jì)模式。

它可以替換掉一個(gè)對(duì)象里面編寫(xiě)復(fù)雜的部分,改變整個(gè)對(duì)象的運(yùn)行和性能,這點(diǎn)功能是非常強(qiáng)大的。另外,一個(gè)特定策略使用以后馬上就被清空了,這個(gè)使得剩下的API非常容易執(zhí)行。從根本上說(shuō),選用哪個(gè)運(yùn)算法則對(duì)于其它的代碼來(lái)說(shuō)都是透明的。

互聯(lián)網(wǎng)上有這么一個(gè)說(shuō)法“本質(zhì)上說(shuō),任何一個(gè)事情開(kāi)始的時(shí)候都像在使用策略模式!睘槭裁茨?因?yàn)檫@個(gè)設(shè)計(jì)模式有效應(yīng)用了多形性的特點(diǎn),而這個(gè)也是面向?qū)ο缶幊套顝?qiáng)大的幾個(gè)方面之一。

相關(guān)的設(shè)計(jì)模式

策略模式和其它許多設(shè)計(jì)模式比較起來(lái)是非常類(lèi)似的。策略模式和狀態(tài)模式最大的區(qū)別就是策略模式只是的條件選擇只執(zhí)行一次,而狀態(tài)模式是隨著實(shí)例參數(shù)(對(duì)象實(shí)例的狀態(tài))的改變不停地更改執(zhí)行模式。換句話說(shuō),策略模式只是在對(duì)象初始化的時(shí)候更改執(zhí)行模式,而狀態(tài)模式是根據(jù)對(duì)象實(shí)例的周期時(shí)間而動(dòng)態(tài)地改變對(duì)象實(shí)例的執(zhí)行模式。

注: 設(shè)計(jì)模式—狀態(tài)
Design Pattern—State
狀態(tài)設(shè)計(jì)模式允許一個(gè)對(duì)象實(shí)例因?yàn)橐粋(gè)內(nèi)部的狀態(tài)改變而改變其執(zhí)行模式。  因此,對(duì)象實(shí)例自身可以有效地改變其類(lèi)定義。

油漆工設(shè)計(jì)模式(見(jiàn)第十二章) 在概念上正好和策略模式是相反的。借用GoF的一個(gè)推論,策略模式改變的是一個(gè)對(duì)象實(shí)例的核心的復(fù)雜操作,而油漆工設(shè)計(jì)模式改變的是一個(gè)對(duì)象實(shí)例的皮膚。

最后一個(gè)相關(guān)的設(shè)計(jì)模式是訪問(wèn)者設(shè)計(jì)模式。在策略模式里面,你創(chuàng)建一個(gè)實(shí)際的選擇的策略的對(duì)象實(shí)例然后把它綁定到一個(gè)實(shí)例參數(shù)中;在訪問(wèn)者模式里面,策略使用參數(shù)的方式進(jìn)行傳遞的。你可以想象下訪問(wèn)者設(shè)計(jì)模式,它的設(shè)計(jì)思路和策略模式正好相反。

下文:《PHP設(shè)計(jì)模式介紹》第八章 迭代器模式

本文鏈接:http://m.95time.cn/tech/program/2008/5992.asp 

出處:
責(zé)任編輯:bluehearts

上一頁(yè) php設(shè)計(jì)模式介紹之策略模式 [4] 下一頁(yè)

◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
php設(shè)計(jì)模式介紹之迭代器模式
php設(shè)計(jì)模式介紹之偽對(duì)象模式
php設(shè)計(jì)模式介紹之注冊(cè)模式
php設(shè)計(jì)模式介紹之單件模式
flash+php+mysql簡(jiǎn)單留言本教程
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門(mén)搜索:CSS Fireworks 設(shè)計(jì)比賽 網(wǎng)頁(yè)制作 web標(biāo)準(zhǔn) 用戶體驗(yàn) UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點(diǎn)最新 站點(diǎn)最新列表
周大!熬•自然”設(shè)計(jì)大賽開(kāi)啟
國(guó)際體驗(yàn)設(shè)計(jì)大會(huì)7月將在京舉行
中國(guó)國(guó)防科技信息中心標(biāo)志征集
云計(jì)算如何讓安全問(wèn)題可控
云計(jì)算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機(jī)會(huì)
阿里行云
云手機(jī)年終巨獻(xiàn),送禮標(biāo)配299起
阿里巴巴CTO王堅(jiān)的"云和互聯(lián)網(wǎng)觀"
1499元買(mǎi)真八核 云OS雙蛋大促
首屆COCO桌面手機(jī)主題設(shè)計(jì)大賽
欄目最新 欄目最新列表
淺談JavaScript編程語(yǔ)言的編碼規(guī)范
如何在illustrator中繪制臺(tái)歷
Ps簡(jiǎn)單繪制一個(gè)可愛(ài)的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡(jiǎn)單的作品展示頁(yè)面
CSS定位機(jī)制之一:普通流
25個(gè)最佳最閃亮的Eclipse開(kāi)發(fā)項(xiàng)目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule
>> 分頁(yè) 首頁(yè) 前頁(yè) 后頁(yè) 尾頁(yè) 頁(yè)次:5/5頁(yè) 1個(gè)記錄/頁(yè) 轉(zhuǎn)到 頁(yè) 共5個(gè)記錄

藍(lán)色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨(dú)家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點(diǎn)的原創(chuàng)文章,但原作者和來(lái)自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來(lái)自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請(qǐng)不要盜鏈到本站,且不準(zhǔn)打上各自站點(diǎn)的水印,亦不能抹去我站點(diǎn)水印。

特別注意:本站所提供的攝影照片,插畫(huà),設(shè)計(jì)作品,如需使用,請(qǐng)與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請(qǐng)與我們聯(lián)系,我們將立即刪除修改。

您的評(píng)論
用戶名:  口令:
說(shuō)明:輸入正確的用戶名和密碼才能參與評(píng)論。如果您不是本站會(huì)員,你可以注冊(cè) 為本站會(huì)員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯(cuò)誤,請(qǐng)用報(bào)告錯(cuò)誤,以利文檔及時(shí)修改。
不評(píng)分 1 2 3 4 5
注意:請(qǐng)不要在評(píng)論中含與內(nèi)容無(wú)關(guān)的廣告鏈接,違者封ID
請(qǐng)您注意:
·不良評(píng)論請(qǐng)用報(bào)告管理員,以利管理員及時(shí)刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國(guó)的各項(xiàng)有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評(píng)論管理人員有權(quán)保留或刪除其管轄評(píng)論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評(píng)論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評(píng)論文檔 | 報(bào)告錯(cuò)誤  
專(zhuān)業(yè)書(shū)推薦 更多內(nèi)容
網(wǎng)站可用性測(cè)試及優(yōu)化指南
《寫(xiě)給大家看的色彩書(shū)1》
《跟我去香港》
眾妙之門(mén)—網(wǎng)站UI 設(shè)計(jì)之道
《Flex 4.0 RIA開(kāi)發(fā)寶典》
《贏在設(shè)計(jì)》
犀利開(kāi)發(fā)—jQuery內(nèi)核詳解與實(shí)踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2