摘要:概念迭代器模式,又叫做游標(biāo)模式。另外,當(dāng)需要對(duì)聚集有多種方式遍歷時(shí),可以考慮去使用迭代器模式。迭代器模式為遍歷不同的聚集結(jié)構(gòu)提供如開始下一個(gè)是否結(jié)束當(dāng)前哪一項(xiàng)等統(tǒng)一的接口。
概念
迭代器模式(Iterator),又叫做游標(biāo)(Cursor)模式。提供一種方法順序訪問一個(gè)聚合對(duì)象中的各種元素,而又不暴露該對(duì)象的內(nèi)部表示。
當(dāng)你需要訪問一個(gè)聚合對(duì)象,而且不管這些對(duì)象是什么都需要遍歷的時(shí)候,就應(yīng)該考慮使用迭代器模式。另外,當(dāng)需要對(duì)聚集有多種方式遍歷時(shí),可以考慮去使用迭代器模式。迭代器模式為遍歷不同的聚集結(jié)構(gòu)提供如開始、下一個(gè)、是否結(jié)束、當(dāng)前哪一項(xiàng)等統(tǒng)一的接口。
適用場(chǎng)景訪問一個(gè)聚合對(duì)象的內(nèi)容而無需暴露它的內(nèi)部表示
支持對(duì)聚合對(duì)象的多種遍歷
為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口
UML圖 角色Iterator(迭代器):迭代器定義訪問和遍歷元素的接口
ConcreteIterator(具體迭代器):具體迭代器實(shí)現(xiàn)迭代器接口,對(duì)該聚合遍歷時(shí)跟蹤當(dāng)前位置
Aggregate (聚合): 聚合定義創(chuàng)建相應(yīng)迭代器對(duì)象的接口
ConcreteAggregate (具體聚合):具體聚合實(shí)現(xiàn)創(chuàng)建相應(yīng)迭代器的接口,該操作返回ConcreteIterator的一個(gè)適當(dāng)?shù)膶?shí)例
代碼代碼如下:
PHP SPL中已經(jīng)提供了迭代器接口Iterator和容器接口IteatorAggragate,其源碼如下:
/** * Interface to detect if a class is traversable using &foreach;. * @link http://php.net/manual/en/class.traversable.php */ interface Traversable { } /** * Interface to create an external Iterator. * @link http://php.net/manual/en/class.iteratoraggregate.php */ interface IteratorAggregate extends Traversable { /** * Retrieve an external iterator * @link http://php.net/manual/en/iteratoraggregate.getiterator.php * @return Traversable An instance of an object implementing Iterator or * Traversable * @since 5.0.0 */ public function getIterator(); } /** * Interface for external iterators or objects that can be iterated * themselves internally. * @link http://php.net/manual/en/class.iterator.php */ interface Iterator extends Traversable { /** * Return the current element * @link http://php.net/manual/en/iterator.current.php * @return mixed Can return any type. * @since 5.0.0 */ public function current(); /** * Move forward to next element * @link http://php.net/manual/en/iterator.next.php * @return void Any returned value is ignored. * @since 5.0.0 */ public function next(); /** * Return the key of the current element * @link http://php.net/manual/en/iterator.key.php * @return mixed scalar on success, or null on failure. * @since 5.0.0 */ public function key(); /** * Checks if current position is valid * @link http://php.net/manual/en/iterator.valid.php * @return boolean The return value will be casted to boolean and then evaluated. * Returns true on success or false on failure. * @since 5.0.0 */ public function valid(); /** * Rewind the Iterator to the first element * @link http://php.net/manual/en/iterator.rewind.php * @return void Any returned value is ignored. * @since 5.0.0 */ public function rewind(); }
這里我們直接實(shí)現(xiàn)上面兩個(gè)接口,請(qǐng)看下面代碼:
array = $array; $this->position = 0; } function rewind() { $this->position = 0; } function current() { return $this->array[$this->position]; } function key() { return $this->position; } function next() { ++$this->position; } function valid() { return isset($this->array[$this->position]); } } /** * Class MyAggregate 聚合容器 */ class ConcreteAggregate implements IteratorAggregate { public $property; /** * 添加屬性 * * @param $property */ public function addProperty($property) { $this->property[] = $property; } public function getIterator() { return new ConcreteIterator($this->property); } } /** * Class Client 客戶端測(cè)試 */ class Client { public static function test() { //創(chuàng)建一個(gè)容器 $concreteAggregate = new ConcreteAggregate(); // 添加屬性 $concreteAggregate->addProperty("屬性1"); // 添加屬性 $concreteAggregate->addProperty("屬性2"); //給容器創(chuàng)建迭代器 $iterator = $concreteAggregate->getIterator(); //遍歷 while($iterator->valid()) { $key = $iterator->key(); $value = $iterator->current(); echo "鍵: ".$key." 值: ".$value."
"; $iterator->next(); } } } Client:: test();
運(yùn)行結(jié)果:
鍵: 0 值: 屬性1 鍵: 1 值: 屬性2
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/22074.html
摘要:分別為適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。設(shè)計(jì)模式五適配器模式適配器模式將某個(gè)對(duì)象的接生成器和協(xié)程的實(shí)現(xiàn)在這篇文章中,作者針對(duì)那些比較難以理解的概念,以一個(gè)更為通俗的方式去講明白。。 PHP 源碼注解 PHP 的詳細(xì)源碼注解 PHP 字符串操作整理 一些有關(guān)字符串的常用操作。 Redis 常見七種使用場(chǎng)景 (PHP 實(shí)戰(zhàn)) 這篇文章主要介紹利用 R...
摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:我們今天也來做一個(gè)萬能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...
摘要:類實(shí)現(xiàn)了對(duì)象存儲(chǔ)映射表,應(yīng)用于需要唯一標(biāo)識(shí)多個(gè)對(duì)象的存儲(chǔ)場(chǎng)景。在之前僅能存儲(chǔ)對(duì)象,之后可以針對(duì)每個(gè)對(duì)象添加一條對(duì)應(yīng)的數(shù)據(jù)。實(shí)際上他們并沒有直接的關(guān)系。 1. 定義 php.net上的定義 The SplObjectStorage class provides a map from objects to data or, by ignoring data, an object set. ...
摘要:生成器的內(nèi)部一直在停頓和恢復(fù)之間切換,直到循環(huán)完成或停頓位置缺點(diǎn)生成器不能滿足所有迭代器的需求,因?yàn)槿绻徊樵儯善饔肋h(yuǎn)不知道下一個(gè)要迭代的值是什么,在生成器中無法后退或前進(jìn)。 一.迭代器 分析:想一下,如果把集合對(duì)象和對(duì)集合對(duì)象的操作放在一起,當(dāng)我們想換一種方式遍歷集合對(duì)象中元素時(shí),就需要修改集合對(duì)象了,違背單一職責(zé)原則,而迭代器模式將數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的算法分離開,兩者可獨(dú)立發(fā)展...
閱讀 3725·2021-09-22 10:57
閱讀 1914·2019-08-30 15:55
閱讀 2699·2019-08-30 15:44
閱讀 1731·2019-08-30 15:44
閱讀 1876·2019-08-30 15:44
閱讀 2244·2019-08-30 12:49
閱讀 1053·2019-08-29 18:47
閱讀 3135·2019-08-29 16:15