1. 程式人生 > >Php設計模式之【迭代器模式Iterator Pattern】

Php設計模式之【迭代器模式Iterator Pattern】

概述

迭代器(Iterator)模式,又叫做遊標(Cursor)模式。GOF給出的定義為:提供一種方法訪問一個容器(container)物件中各個元素,而又不需暴露該物件的內部細節。

案例

黑棗電視公司的在生產的電視機,使用遙控器[後一個]和[前一個]按鈕調節頻道。當按下[後一個]按鈕時,將切換到下一個預置的頻道。想象一下在陌生的城市中的旅店中看電視。當改變頻道時,重要的不是幾頻道,而是節目內容。如果對一個頻道的節目不感興趣,那麼可以換下一個頻道,而不需要知道它是幾頻道。。

分析OOA:

迭代器模式是為容器而生。很明顯,對容器物件的訪問必然涉及到遍歷演算法。這裡有兩個方案:

方案一、可以將遍歷方法塞到容器物件中去

方案二、容器不去提供什麼遍歷演算法,讓使用容器的人自己去實現去吧。

方案一中,容器承受了過多的功能,它不僅要負責自己“容器”內的元素維護(新增、刪除等等),而且還要提供遍歷自身的介面;而且由於遍歷狀態儲存的問題,不能對同一個容器物件同時進行多個遍歷。方案二倒是省事又提高了容器的內聚能力。

設計OOD:

<UML>


<說明>

  1. 迭代器角色(ChanelIterator):迭代器角色負責定義訪問和遍歷元素的介面。
    在本例中ChanelIterator定義迭代器必須實現moveText\first\next\current方法
  2. 具體迭代器角色(Concrete Iterator):具體迭代器角色要實現迭代器介面,並要記錄遍歷中的當前位置。
    TvChannelIterator為電視訊道的具體迭代實現類,封裝了具體的迭代演算法。
  3. 容器角色(Container):容器角色負責提供建立具體迭代器角色的介面。
    在本例中ChannelList為容器角色,定義了getIterator以使容器角色取得一個具體迭代器角色例項。
  4. 具體容器角色(Concrete Container):具體容器角色實現建立具體迭代器角色的介面——這個具體迭代器角色於該容器的結構相關。
    在本例中TvChannellist為具體容器角色

程式設計 OOP:

<程式碼>

//迭代器角色(Iterator)
interface ChannelIterator
{
    /**
     * 判斷可否向下移動遊標
     * @abstract
     * @return boolean
     */
    public function moveNext();

    /**
     * 將遊標置0
     * @abstract
     * @return none
     */
    public function first();

    /**
     * 向前移動遊標
     * @abstract
     * @return none
     */
    public function next();

    /**
     * 取得當前遊標所指資料項
     * @abstract
     * @return none
     */
    public function current();
}

//具體迭代器角色(Concrete Iterator)
class TvChannelIterator implements ChannelIterator
{
    private $list = null;
    private $index = 0;
    public function __construct($list){
        $this->list = $list;
        $index = 0;
    }
    public function moveNext()
    {
        if($this->index < count($this->list)){
            return true;
        }else{
            return false;
        }
    }

    public function first()
    {
       $this->index = 0;
    }

    public function next()
    {
       if( $this->index < count($this->list)) $this->index++;
    }

    public function current()
    {
        return $this->list[$this->index];
    }
}
//容器角色(Container)
interface ChannelList
{
    /**
     * 取得一個具體迭代器角色例項
     * @abstract
     * @return mixed 具體迭代器角色例項
     */
    public function getIterator();
}

//具體容器角色(Concrete Container)
class TvChannellist implements ChannelList
{
    private $list;

    public function __construct()
    {
        $this->list = array(
            '0' => '北京臺',
            '1' => '山東臺',
            '2' => '湖南臺',
            '3' => '鳳凰臺',
            '4' => '河北臺'
        );
    }

    public function getIterator()
    {
        return new TvChannelIterator($this->list);
    }

    public function getLength()
    {
        return count($this->list);
    }

    public function getChannel($index = 0)
    {
        return $this->list[$index];
    }
}


測試用例Test Case:

<程式碼>

class testDriver
{
    public function run()
    {
        $channels = new TvChannellist();
        $iterator = $channels->getIterator();
        while($iterator->moveNext()){
            echo "頻道:". $iterator->current()."\n";
            $iterator->next();
        }
    }
}

$test = new testDriver();
$test->run();

<輸出>


小結:

面向物件設計原則中有一條是類的單一職責原則,所以我們要儘可能的去分解這些職責,用不同的類去承擔不同的職責。Iterator模式就是分離了集合物件的遍歷行為,抽象出一個迭代器類來負責,這樣既可以做到不暴露集合的內部結構,又可讓外部程式碼透明的訪問集合內部的資料。

【常用情境】:

1.訪問一個聚合物件的內容而無需暴露它的內部表示。

2.支援對聚合物件的多種遍歷。

3.為遍歷不同的聚合結構提供一個統一的介面(即, 支援多型迭代)。

【優點】

支援以不同的方式遍歷一個容器角色。根據實現方式的不同,效果上會有差別。

2. 簡化了容器的介面。

3. 對同一個容器物件,可以同時進行多個遍歷。因為遍歷狀態是儲存在每一個迭代器物件中的。

【缺點 】

由於迭代器模式將儲存資料和遍歷資料的職責分離,增加新的聚合類需要對應增加新的迭代器類,類的個數成對增加,這在一定程度上增加了系統的複雜性。

將容器的內部細節向迭代器暴露無遺

*********************轉載請註明來源********************

* 作者:葉文濤 

* 標題:Php設計模式之迭代器模式Iterator Pattern(一)

* 參考:

*《Head First設計模式》Eric Freeman等著

*《PHP設計模式》Aaron Saray等著,樑志敏等譯(PS:翻譯的是狗屁水平)

*  Java設計模式之迭代器模式 http://www.51cto.com/specbook/11/9578.htm

*  .NET設計模式(18):迭代器模式(Iterator Pattern)http://www.cnblogs.com/Terrylee/archive/2006/09/16/Iterator_Pattern.html

*********************轉載請註明來源********************

相關推薦

Php設計模式模式Iterator Pattern

概述 迭代器(Iterator)模式,又叫做遊標(Cursor)模式。GOF給出的定義為:提供一種方法訪問一個容器(container)物件中各個元素,而又不需暴露該物件的內部細節。 案例 黑棗電視公司的在生產的電視機,使用遙控器[後一個]和[前一個]按鈕調節頻道。當按下[

java 開發模式十 : 模式

原理或定義 迭代器模式又叫做遊標(Cursor)模式。GOF給出的定義:提供一種方法訪問一個容器(container)物件中的各個元素,而又不暴露該物件的內部細節。 結構 迭代器角色(Iterator): 負責定義訪問和遍歷元素的介面。具體迭代器角色(Concrete It

設計模式與組合模式

迭代器與組合模式 定義  迭代器模式提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部的表示。 組合模式允許你將物件組合成樹形結構來表現“整體/部分”層次結構。組合能讓客戶以一致的方式處理個別對象以及物件組合 例子  廢話不多說,先看具體案例

模式—— 資料的遍歷

迭代器模式,提供了介面訪問容器中的元素,而不需要暴露容器的內部表現。 一、關鍵點 1)先看下這個模式點關鍵點: 遍歷:該模式的最大特點就是提供了遍歷內部集合資料的介面,從而達到訪問集合資料的目

Go語言設計模式實踐:Iterator

關於本系列 決定開個新坑。 這個系列首先是關於Go語言實踐的。在專案中實際使用Go語言也有段時間了,一個體會就是不論是官方文件、圖書還是網路資料,關於Go語言慣用法(idiom)的介紹都比較少,基本只能靠看標準庫原始碼自己琢磨,所以我特別想在這方面有一些收集和總結。 然後這個系列也是關於設計模式的。雖然G

Java描述設計模式(13):模式

本文原始碼:GitHub·點這裡 || GitEE·點這裡 一、迭代器模式 1、基礎概念 迭代器模式又叫遊標模式,是物件的行為

設計模式-行為型-模式

迭代器模式(Iterator):   迭代器模式允許你訪問一個數據項序列中的所有元素,而無須關心序列是什麼型別(陣列、連結串列、列表或任何其他型別)。它能有效地構建一個數據管道,經過一系列不同的轉換或過濾後再從管道的另一端出來。迭代器模式就是提供一種遍歷集合元素的統一介面,用一致的方法遍歷集合元素,不需要知

重學 Java 設計模式:實戰模式「模擬公司組織架構樹結構關係,深度遍歷人員資訊輸出場景」

![](https://img-blog.csdnimg.cn/20200623234005361.png) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) - `原創系列專題文章` >沉澱、分享、成長,讓自己和他人都能有所收穫!

C++STLiterator

1、vector #include <iostream> #include <vector> int main() { std::vector<char> charVector; int x; for (x=0; x&l

JAVA設計模式 模式Iterator Pattern

一、概述     提供一種方法來訪問聚合物件(容器container),而不用暴露這個物件的內部細節。屬於物件行為型模式。 二、適用場景     1>遍歷訪問聚合物件中的元素,而無須暴露它的內容表示,將聚合物件的訪問和內部資料的儲存分離。使得訪問聚合物件時無須瞭解

設計模式的藝術 行為型模式模式

前言 現在的電視機都配置了一個遙控器,使用者可以通過遙控器去選擇上一個或者下一個臺,我們只需要知道如何使用這個遙控器,而無須關注電視是怎麼把電視訊道放入其中的,在軟體實際的開發中,也有這麼一種類,它儲存著多個成員物件,這些類通常稱為聚合類,對應的物件稱為聚合物件。為了方便操作這些聚合物件,同時可

(五)設計模式模式Iterator

前言: 參考圖書:軟體設計模式與體系結構 參考部落格:https://www.cnblogs.com/wanson/articles/9277813.html   正題:         迭代器(iterator)有時又稱遊標

golang設計模式模式

迭代器模式 定義 wiki: 在 物件導向程式設計裡,迭代器模式是一種設計模式,是一種最簡單也最常見的設計模式。它可以讓使用者透過特定的介面巡訪容器中的每一個元素而不用瞭解底層的實作。 簡單點說,為一個容器設定一個迭代函式,可以使用這個迭代函式來順序訪問其中的每一個元素,而外部無需知道底層實現

23種設計模式(二十三)模式(python_c++實現) .md

23種設計模式之(二十三)迭代器模式(Iterator) 本文主要介紹23種設計模式之迭代器模式,附詳細python/c++示例程式碼。 概念 應用場景 注意事項 程式碼示例 總結 程式碼連結 迭代器模式(Iterator) 概念 迭代模式,是行為模式之一

15、設計模式(行為型)模式

作用 提供一種方法順序訪問一個聚合物件中各個元素, 而又無須暴露該物件的內部表示。 何時使用 遍歷一個聚合物件。 優點 它支援以不同的方式遍歷一個聚合物件。 迭代器簡化了聚合類。 在同一個聚合

設計模式模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 程式設計環境中非常常用的設計模式。這種模式用於順序訪問集合物件的元素,不需要知道集合物件的底層表示。 迭代器模式屬於行為型模式

移動開發設計模式-模式(IOS&Android)

資源 完全參照 迭代器模式|菜鳥教程 ,但不包括IOS程式碼 迭代器模式 迭代器模式(Iterator Pattern)是 Java 和 .Net 程式設計環境中非常常用的設計模式。這種模式用於順序訪問集合物件的元素,不需要知道集合物件的底層表示。 迭代器模式屬於行為型模式。

Java進階篇設計模式九----- 直譯器模式模式

前言 在上一篇中我們學習了行為型模式的責任鏈模式(Chain of Responsibility Pattern)和命令模式(Command Pattern)。本篇則來學習下行為型模式的兩個模式, 直譯器模式(Interpreter Pattern)和迭代器模式

設計模式模式

模式定義 迭代器模式提供一種方法順序訪問一個聚合物件中的各個元素,而又不暴露其內部的表示。 下圖是該模式的類圖: 一個生動的例子 迭代器介面: public interface Iterator<E> { boolean hasNext(); E ne

23種設計模式模式

迭代器模式的定義 定義: 它提供一種方法訪問一個容器物件中各個元素, 而又不需暴露該物件的內部細節 其類圖如下:   其中角色: Iterator 抽象迭代器: 抽象迭代器負責定義訪問和遍歷元素的介面, 而且基本上是有固定的三個方法: first()獲得第一個元素, n