成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

PHP設(shè)計模式漫談之迭代器模式

原創(chuàng)
開發(fā) 后端
今天的PHP設(shè)計模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于對象圖不明部分的一組對象(或標(biāo)量)集合上的迭代。

【51CTO獨家特稿】今天《PHP設(shè)計模式漫談》系列的主角是迭代器(Iterator)模式,它在一個很常見的過程上提供了一個抽象:位于對象圖不明部分的一組對象(或標(biāo)量)集合上的迭代。迭代有幾種不同的具體執(zhí)行方法:在數(shù)組屬性,集合對象,數(shù)組,甚至一個查詢結(jié)果集之上迭代。

在對象的世界里,迭代器模式要維持類似數(shù)組的功能,看作是一個非侵入性對象刻面(facet),Client類往往分離自真實對象實現(xiàn),指iterator接口。只要有可能,我們可以給迭代器傳送一個引用,代替將來可能發(fā)生變化的具體或抽象類。

迭代器模式 
圖1 迭代器模式

參與者:

◆客戶端(Client):引用迭代器模式的方法在一組值或?qū)ο笊蠄?zhí)行一個循環(huán)。

◆迭代器(Iterator):在迭代過程上的抽象,包括next(),isFinished(),current()等方法。

◆具體迭代器(ConcreteIterators):在一個特定的對象集,如數(shù)組,樹,組合,集合等上實現(xiàn)迭代。

通過Traversable接口,PHP原生態(tài)支持迭代器模式,這個接口由Iterator和IteratorAggregate做了擴(kuò)展,這兩個子接口不僅是定義了一套標(biāo)準(zhǔn)的方法,每個Traversable對象都可以原封不動地傳遞給foreach(),foreach是迭代器的主要客戶端,Iterator實現(xiàn)是真正的迭代器,而IteratorAggregate是有其它職責(zé)的Traversable對象,它通過getIterator()方法返回一個Iterator。

PHP架構(gòu)

標(biāo)準(zhǔn)PHP庫是PHP中綁定的唯一通用目的面向?qū)ο髱欤x了額外的接口和公用類。OuterIterator實現(xiàn)裝飾一個Iterator,CachingIterator和LimitIterator是這個接口的兩個例子。

RecursiveIterator是Iterator接口為樹形結(jié)構(gòu)實現(xiàn)的一個擴(kuò)展,它定義了一組額外的方法檢查迭代中當(dāng)前元素的子對象是否存在。RecursiveArrayIterator和RecursiveDirectoryIterator是這個接口的實現(xiàn)示例,這些類型的迭代器可以原樣使用,或是用一個RecursiveIteratorIterator橋接到一個普通的迭代器契約。這個OuterIterator實現(xiàn)將會根據(jù)構(gòu)造參數(shù)執(zhí)行深度優(yōu)先或廣度優(yōu)先遍歷。

使用RecursiveIteratorIterator時,可以將其傳遞給foreach,請看后面的代碼示例,了解RecursiveIterators的不同用法和它們的超集Iterator。最后,SeekableIterators向契約添加了一個seek()方法,它可以用于移動Iterator的內(nèi)部狀態(tài)到一個特定的迭代點。#p#

注意,迭代器是比對象集更好的抽象,因為我們可以讓InfiniteIterators,NoRewindIterators等,不用與普通數(shù)組陣列與一致,因此,Iterator缺少count()函數(shù)等功能。
在PHP官方手冊中可以找到完整的SPL迭代器列表。得益于對PHP的強(qiáng)力支持,使用迭代器模式的大部分工作都包括在標(biāo)準(zhǔn)實現(xiàn)中,下面的代碼示例就利用了標(biāo)準(zhǔn)Iterator和RecursiveIterators的功能。

  1. <?php 
  2. /**  
  3.  * Collection that wraps a numeric array.  
  4.  * All five public methods are needed to implement  
  5.  * the Iterator interface.  
  6.  */  
  7. class Collection implements Iterator  
  8. {  
  9.     private $_content;  
  10.     private $_index = 0;  
  11.  
  12.     public function __construct(array $content)  
  13.     {  
  14.         $this->_content = $content;  
  15.     }  
  16.  
  17.     public function rewind()  
  18.     {  
  19.         $this->_index = 0;  
  20.     }  
  21.  
  22.     public function valid()  
  23.     {  
  24.         return isset($this->_content[$this->_index]);  
  25.     }  
  26.  
  27.     public function current()  
  28.     {  
  29.         return $this->_content[$this->_index];  
  30.     }  
  31.  
  32.     public function key()  
  33.     {  
  34.         return $this->_index;  
  35.     }  
  36.  
  37.     public function next()  
  38.     {  
  39.         $this->_index++;  
  40.     }  
  41. }  
  42.  
  43. $arrayarray = array('A', 'B', 'C', 'D');  
  44. echo "Collection: ";  
  45. foreach (new Collection($array) as $key => $value) {  
  46.     echo "$key => $value. ";  
  47. }  
  48. echo "\n"; 
  1. /**  
  2.  * Usually IteratorAggregate is the interface to implement.  
  3.  * It has only one method, which must return an Iterator  
  4.  * already defined as another class (e.g. ArrayIterator)  
  5.  * Iterator gives a finer control over the algorithm,  
  6.  * because all the hook points of Iterator' contract  
  7.  * are available for implementation.  
  8.  */  
  9. class NumbersSet implements IteratorAggregate  
  10. {  
  11.     private $_content;  
  12.  
  13.     public function __construct(array $content)  
  14.     {  
  15.         $this->_content = $content;  
  16.     }  
  17.  
  18.     public function contains($number)  
  19.     {  
  20.         return in_array($number, $this->_content);  
  21.     }  
  22.  
  23.     /**  
  24.      * Only this method is necessary to implement IteratorAggregate.  
  25.      * @return Iterator  
  26.      */  
  27.     public function getIterator()  
  28.     {  
  29.         return new ArrayIterator($this->_content);  
  30.     }  
  31. }  
  32.  
  33. echo "NumbersSet: ";  
  34. foreach (new NumbersSet($array) as $key => $value) {  
  35.     echo "$key => $value. ";  
  36. }  
  37. echo "\n"; 
  1. // let's play with RecursiveIterator implementations  
  2. $it = new RecursiveArrayIterator(array(  
  3.     'A',  
  4.     'B',  
  5.     array(  
  6.         'C',  
  7.         'D'  
  8.     ),  
  9.     array(  
  10.         array(  
  11.             'E',  
  12.             'F'  
  13.         ),  
  14.         array(  
  15.             'G',  
  16.             'H',  
  17.             'I'  
  18.         )  
  19.     )  
  20. ));  
  21. // $it is a RecursiveIterator but also an Iterator,  
  22. // so it loops normally over the four elements  
  23. // of the array.  
  24. echo "Foreach over a RecursiveIterator: ";  
  25. foreach ($it as $value) {  
  26.     echo $value;  
  27.     // but RecursiveIterators specify additional  
  28.     // methods to explore children nodes  
  29.     $children = $it->hasChildren() ? '{Yes}' : '{No}';  
  30.     echo $children, ' ';  
  31. }  
  32. echo "\n";  
  33. // we can bridge it to a different contract via  
  34. // a RecursiveIteratorIterator, whose cryptic name  
  35. // should be read as 'an Iterator that spans over  
  36. // a RecursiveIterator'.  
  37. echo "Foreach over a RecursiveIteratorIterator: ";  
  38. foreach (new RecursiveIteratorIterator($it) as $value) {  
  39.     echo $value;  
  40. }  
  41. echo "\n"; 

原文名:Practical Php Patterns: Iterator        作者:Giorgio

原文出處:http://giorgiosironi.blogspot.com/search/label/practical%20php%20patterns

【PHP設(shè)計模式系列】

  1. PHP設(shè)計模式漫談之解釋器模式
  2. PHP設(shè)計模式漫談之工廠模式
  3. PHP設(shè)計模式漫談之命令模式
  4. PHP設(shè)計模式漫談之結(jié)構(gòu)模式
  5. PHP設(shè)計模式漫談之責(zé)任鏈模式
  6. PHP設(shè)計模式漫談之代理模式
責(zé)任編輯:王曉東 來源: 51CTO.com
相關(guān)推薦

2010-04-21 08:38:18

解釋器模式PHP設(shè)計模式

2010-04-13 08:54:28

PHP設(shè)計模式命令模式

2010-03-25 08:52:30

PHP設(shè)計模式代理模式

2010-04-19 09:30:00

工廠模式PHP設(shè)計模式

2010-04-01 09:10:03

PHP設(shè)計模式責(zé)任鏈模式

2010-04-08 09:27:04

PHP設(shè)計模式結(jié)構(gòu)模式

2010-05-06 08:44:37

調(diào)解者模式

2021-06-22 15:27:13

設(shè)計模式迭代器模式Java

2020-11-06 09:01:46

迭代器模式

2023-09-04 13:14:00

裝飾器設(shè)計模式

2023-12-13 13:28:16

裝飾器模式Python設(shè)計模式

2011-04-21 09:46:41

設(shè)計模式

2020-08-21 07:23:50

工廠模式設(shè)計

2021-01-04 09:43:24

Python 開發(fā)編程語言

2015-09-08 13:39:10

JavaScript設(shè)計模式

2021-06-16 08:56:06

模版方法模式設(shè)計模式行為型設(shè)計模式

2012-01-13 15:59:07

2021-06-29 08:54:23

設(shè)計模式代理模式遠(yuǎn)程代理

2021-12-24 07:50:45

責(zé)任鏈模式設(shè)計

2012-02-29 09:41:14

JavaScript
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 黄色在线免费观看视频网站 | 福利片在线 | 国产精品久久一区二区三区 | 国产999精品久久久久久绿帽 | 日本精品一区二区三区在线观看视频 | 国产精品不卡视频 | 欧美精品乱码久久久久久按摩 | 91精品国产一区二区 | 一级片视频免费 | 99久久精品免费看国产四区 | h小视频| 国产精品自产拍在线观看蜜 | 久久天天 | 午夜精品久久久久久久久久久久久 | 91视频在线看 | 欧美精品在线观看 | 国产精品国产成人国产三级 | 99久久精品一区二区成人 | 欧美黑人狂野猛交老妇 | 国产精品免费视频一区 | 中文字幕久久精品 | 1204国产成人精品视频 | 成人午夜免费网站 | 成人午夜网 | 国产一区二区三区四区三区四 | 亚洲九色 | 亚洲成人av| 国产激情偷乱视频一区二区三区 | 另类专区亚洲 | 一区二区三区日本 | 国产精品一区二区三区在线 | 日韩欧美在线一区二区 | 亚洲在线| 网色| 玖玖综合在线 | 国产99久久| 亚洲成人免费视频 | 香蕉视频91 | 色资源av| 看亚洲a级一级毛片 | 日韩中文字幕第一页 |