1. 程式人生 > 其它 >設計模式專題(十六)——迭代器模式

設計模式專題(十六)——迭代器模式

設計模式專題(十六)——迭代器模式

(原創內容,轉載請註明來源,謝謝)

一、概述

迭代器模式(Iterator)提供一種方法,順序訪問一個聚合物件中的每個元素,而又不暴露該物件的內部表示。當需要訪問一個聚集物件,不管這些物件是什麼都要遍歷,則就要用到迭代器模式。另外,對聚集有多種方式遍歷時,也可以用迭代器模式。

迭代器為遍歷不同的聚集結構提供了開始入口、訪問下一個、判斷是否結束、當前某一項內容等的統一介面。foreach就是一個迭代器的體現,其不管傳入的陣列內部構造,都會逐個遍歷陣列的元素。

二、類圖

三、PHP中的迭代器

PHP中,通常情況下,foreach只能對陣列遍歷,當需要對類進行遍歷,PHP提供了介面,實現介面的類就可以直接用foreach進行遍歷。關於此部分內容,有一篇很經典的部落格——http://www.ruanyifeng.com/blog/2008/07/php_spl_notes.html,裡面除了迭代器,還講了PHP的SPL裡面的各中類和介面。

1、Iterator介面

該介面定義了五個方法,包括current、next、key、valid、rewind,需要在current裡面實現獲取返回當前內容;next裡實現迴圈到下一個元素;key實現獲取鍵的方式;valid實現驗證當前鍵是否有效;rewind實現。

2、IteratorAggregate介面

雖然Iterator介面可以實現對物件屬性的遍歷,但是很複雜,需要實現五個方法,較為繁瑣。因此,PHP還定義了一個迭代器,IteratorAggregate。

繼承該介面的類,只需要實現一個方法,getIterator,就可以實現迭代的功能。該方法需要返回另一個PHP內部定義的類Traversable的例項。

在PHP官方文件中已經很清晰的說明如何使用:

<?php
class myData implementsIteratorAggregate {
    public $property1 = "Public propertyone";
    public $property2 = "Public propertytwo";
    public $property3 = "Public propertythree";
    public function __construct() {
        $this->property4 = "lastproperty";
    }
    public function getIterator() {
        return new ArrayIterator($this);
    }
}
$obj = new myData;
foreach($obj as $key=> $value) {
    var_dump($key, $value);
    echo "n";
}
?>

這個方法的輸出了屬性、屬性值,如下:

string(9) "property1"
string(19) "Public propertyone"
string(9) "property2"
string(19) "Public propertytwo"
string(9) "property3"
string(21) "Public propertythree"
string(9) "property4"
string(13) "lastproperty"

——written by linhxx 2017.08.14

相關閱讀:

設計模式專題(十五) ——組合模式

設計模式專題(十四)——介面卡模式

設計模式專題(十三) ——備忘錄模式

設計模式專題(十二)——狀態模式

設計模式專題(十一)——抽象工廠模式

設計模式專題(十)——觀察者模式

設計模式專題(九) ——外觀模式

設計模式專題(八) ——模板方法模式

設計模式專題(七)——建造者模式

設計模式專題(六)——原型模式

設計模式專題(五)——工廠方法模式

設計模式專題(四)——代理模式

設計模式專題(三)——裝飾模式

設計模式專題(二)——策略模式

設計模式專題(一)——面向物件的設計原則