亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

PHP設(shè)計(jì)模式之迭代器模式Iterator實(shí)例分析【對(duì)象行為型】

瀏覽:96日期:2022-09-10 16:30:44

本文實(shí)例講述了PHP設(shè)計(jì)模式之迭代器模式Iterator。分享給大家供大家參考,具體如下:

1.概述

類中的面向?qū)ο缶幊谭庋b應(yīng)用邏輯。類,就是實(shí)例化的對(duì)象,每個(gè)單獨(dú)的對(duì)象都有一個(gè)特定的身份和狀態(tài)。單獨(dú)的對(duì)象是一種組織代碼的有用方法,但通常你會(huì)處理一組對(duì)象或者集合。

集合不一定是均一的。圖形用戶界面框架中的 Window 對(duì)象可以收集任意數(shù)量的控制對(duì)象 - Menu、Slider 和 Button。并且,集合的實(shí)現(xiàn)可以有多種方式:PHP 數(shù)字是一個(gè)集合,但也是一個(gè)散列表,一個(gè)鏈接列表,一個(gè)堆棧以及隊(duì)列。

例子1:電視遙控器的頻道遍歷

PHP設(shè)計(jì)模式之迭代器模式Iterator實(shí)例分析【對(duì)象行為型】

2.問題

如何操縱任意的對(duì)象集合?

如一個(gè)列表(List)或者一個(gè)集合(Set),我們又如何提供一種方法來讓別人可以訪問它的元素,而又不需要暴露它的內(nèi)部結(jié)構(gòu)?

3.解決方案

迭代器模式:使用迭代器模式來提供對(duì)聚合對(duì)象的統(tǒng)一存取,即提供一個(gè)外部的迭代器來對(duì)聚合對(duì)象進(jìn)行訪問和遍歷 , 而又不需暴露該對(duì)象的內(nèi)部結(jié)構(gòu)。又叫做游標(biāo)(Cursor)模式 。

你可能沒有意識(shí)到這一點(diǎn),但你每天都在使用迭代器模式 。

如在PHP開發(fā)中,它潛藏在 PHP 的數(shù)組類型和各種數(shù)組操作函數(shù)中。(其實(shí),給你一些固有類的數(shù)組的組合和一群用這些固有類工作的可變函數(shù),你將不得不使用這些數(shù)組來處理對(duì)象集合。這是在 PHP 中的本地?cái)?shù)組迭代:

$test = array(‘one’, ‘two’, ‘three’);$output = ‘’; reset($test); do {$output .= current($test);} while (next($test));echo $output; // produces ‘onetwothree’

reset() 函數(shù)將迭代重新轉(zhuǎn)到數(shù)組的開始;current() 返回當(dāng)前元素的值;next() 則前進(jìn)至數(shù)組中的下一個(gè)元素并返回新的 current() 值。當(dāng)你超出數(shù)組的最后一個(gè)元素時(shí),next() 返回 false。使用這些迭代方法,PHP 數(shù)組的內(nèi)部實(shí)現(xiàn)就與你不相關(guān)了。

迭代器結(jié)合了封裝和多態(tài)的面向?qū)ο蟪绦蛟O(shè)計(jì)原理。使用迭代器,你可以對(duì)集合中的對(duì)象進(jìn)行操作,而無需專門了解集合如何顯現(xiàn)或者集合包含什么(對(duì)象的種類)。迭代器提供了不同固定迭代實(shí)現(xiàn)的統(tǒng)一接口,它完全包含了如何操縱特定集合的詳細(xì)信息,包括顯示哪些項(xiàng)(過濾)及其顯示順序(排序)。

4.適用性

迭代器模式可用來:

• 訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示。• 需要為聚合對(duì)象提供多種遍歷方式。• 為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口 (即, 支持多態(tài)迭代)

5.結(jié)構(gòu)

PHP設(shè)計(jì)模式之迭代器模式Iterator實(shí)例分析【對(duì)象行為型】

結(jié)構(gòu)上可以看出,迭代器模式在客戶與容器之間加入了迭代器角色。迭代器角色的加入,就可以很好的避免容器內(nèi)部細(xì)節(jié)的暴露,而且也使得設(shè)計(jì)符號(hào)“單一職責(zé)原則”。

注意,在迭代器模式中,具體迭代器角色和具體容器角色是耦合在一起的——遍歷算法是與容器的內(nèi)部細(xì)節(jié)緊密相關(guān)的。為了使客戶程序從與具體迭代器角色耦合的困境中脫離出來,避免具體迭代器角色的更換給客戶程序帶來的修改,迭代器模式抽象了具體迭代器角色,使得客戶程序更具一般性和重用性。這被稱為多態(tài)迭代。

6.模式的組成

抽象迭代器(Iterator): 迭代器定義訪問和遍歷元素的接口。具體迭代器(ConcreteIterator): 具體迭代器實(shí)現(xiàn)迭代器Iterator接口。對(duì)該聚合遍歷時(shí)跟蹤當(dāng)前位置。抽象聚合類(Aggregate): 聚合定義創(chuàng)建相應(yīng)迭代器對(duì)象的接口。具體聚合類(ConcreteAggregate): 體聚合實(shí)現(xiàn)創(chuàng)建相應(yīng)迭代器的接口,該操作返回ConcreteIterator的一個(gè)適當(dāng)?shù)膶?shí)例。

7.效果

•迭代器模式的作用:

1 ) 它支持以不同的方式遍歷一個(gè)聚合對(duì)象 : 復(fù)雜的聚合可用多種方式進(jìn)行遍歷。迭代器模式使得改變遍歷算法變得很容易 : 僅需用一個(gè)不同的迭代器的實(shí)例代替原先的實(shí)例即可。你也可以自己定義迭代器的子類以支持新的遍歷。2) 迭代器簡(jiǎn)化了聚合的接口 有了迭代器的遍歷接口,聚合本身就不再需要類似的遍歷接口了。這樣就簡(jiǎn)化了聚合的接口。3) 在同一個(gè)聚合上可以有多個(gè)遍歷 每個(gè)迭代器保持它自己的遍歷狀態(tài)。因此你可以同時(shí)進(jìn)行多個(gè)遍歷。4)在迭代器模式中,增加新的聚合類和迭代器類都很方便,無須修改原有代碼,滿足“開閉原則”的要求。

迭代器模式的缺點(diǎn)

由于迭代器模式將存儲(chǔ)數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離,增加新的聚合類需要對(duì)應(yīng)增加新的迭代器類,類的個(gè)數(shù)成對(duì)增加,這在一定程度上增加了系統(tǒng)的復(fù)雜性。

8.實(shí)現(xiàn)

我們直接實(shí)現(xiàn)spl的iterator:

<?php /** * 具體迭代器(ConcreteIterator): 具體迭代器實(shí)現(xiàn)迭代器Iterator接口。對(duì)該聚合遍歷時(shí)跟蹤當(dāng)前位置。 */class ConcreteIterator implements Iterator { protected $_key; protected $_collection; public function __construct($collection){ $this->_collection = $collection; $this->_key = 0; } public function rewind(){ $this->_key = 0; } public function valid(){ return isset($this->_collection[$this->_key]); } public function key(){ return $this->_key; } public function current(){ return $this->_collection[$this->_key]; } public function next(){ return ++$this->_key; } } /** * 具體聚合類(ConcreteAggregate): */class ConcreteAggregate implements IteratorAggregate{ protected $_arr; public function __construct($array){ $this->_arr = $array; } public function getIterator(){ return new ConcreteIterator($this->_arr); }} $_collectionay = array(1,2,3,3,4);$it = new ConcreteIterator($_collectionay);foreach($it as $key=>$value){ echo $key.’:’.$value.’<br/>’;}

9.與其他相關(guān)模式

Composite :迭代器常被應(yīng)用到象復(fù)合這樣的遞歸結(jié)構(gòu)上。Factory Method:多態(tài)迭代器靠Factory Method來例化適當(dāng)?shù)牡髯宇悺emento:常與迭代器模式一起使用。迭代器可使用一個(gè) Memento來捕獲一個(gè)迭代的狀態(tài)。迭代器在其內(nèi)部存儲(chǔ)Memento。

10.總結(jié)與分析

1)聚合是一個(gè)管理和組織數(shù)據(jù)對(duì)象的數(shù)據(jù)結(jié)構(gòu)。2)聚合對(duì)象主要擁有兩個(gè)職責(zé):一是存儲(chǔ)內(nèi)部數(shù)據(jù);二是遍歷內(nèi)部數(shù)據(jù)。3)存儲(chǔ)數(shù)據(jù)是聚合對(duì)象最基本的職責(zé)。4)將遍歷聚合對(duì)象中數(shù)據(jù)的行為提取出來,封裝到一個(gè)迭代器中,通過專門的迭代器來遍歷聚合對(duì)象的內(nèi)部數(shù)據(jù),這就是迭代器模式的本質(zhì)。迭代器模式是“單一職責(zé)原則”的完美體現(xiàn)。

更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》

希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 久久久最新精品 | 99热热热 | 在线国产一区 | 色网址在线 | 国产限制路线1线路2线路3 | 日本一级成人毛片免费观看 | 欧美精品一二三区 | 亚洲成熟xxxx | 亚洲国产成人精品久久 | 亚洲欧洲在线视频 | 欧美日韩中文国产一区 | 国产精品国产三级国产普通话对白 | 亚洲精品91 | 久久亚洲精品一区成人 | 国产免费高清在线精品一区 | 欧美亚洲综合在线 | 国产大学生毛片一级高清 | 特级毛片全部免费播放a一级 | 日韩精品在线观看免费 | 九九视频高清视频免费观看 | 国产成+人+综合+亚洲 欧美 | 久久乐国产精品亚洲综合m3u8 | 片免费观看网站视频 | 九九成人免费视频 | 国产尤物视频在线 | 日日a.v拍夜夜添久久免费 | 亚洲精品在线观看视频 | 善良的后裔完整视频在线观看 | 欧美一区二区三区在线视频 | 爆操欧美美女 | japanese色国产在线看视频 | 亚洲精品久久久久午夜 | freesex双人videos人妖 | 天堂黄色网 | 在线播放亚洲精品富二代91 | 国产特级黄色片 | 亚洲综合视频在线观看 | 在线免费观看小视频 | 天天操夜夜逼 | 黄色片网站观看 | 欧美日韩另类国产 |