一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - PHP教程 - PHP設(shè)計(jì)模式之迭代器(Iterator)模式入門與應(yīng)用詳解

PHP設(shè)計(jì)模式之迭代器(Iterator)模式入門與應(yīng)用詳解

2021-09-22 16:54luyaran PHP教程

這篇文章主要介紹了PHP設(shè)計(jì)模式之迭代器(Iterator)模式,結(jié)合實(shí)例形式詳細(xì)分析了PHP迭代器模式的相關(guān)概念、原理、應(yīng)用案例及操作注意事項(xiàng),需要的朋友可以參考下

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

迭代器有時(shí)又稱光標(biāo)(cursor)是程式設(shè)計(jì)的軟件設(shè)計(jì)模式,可在容器物件(container,例如list或vector)上遍訪的接口,設(shè)計(jì)人員無需關(guān)心容器物件的內(nèi)容,現(xiàn)在呢,各種語言實(shí)作Iterator的方式皆不盡同,有些面向?qū)ο笳Z言像Java, C#, Python, Delphi都已將Iterator的特性內(nèi)建語言當(dāng)中,完美的跟語言整合,我們稱之隱式迭代器(implicit iterator),但像是C++語言本身就沒有Iterator的特色,但STL仍利用template實(shí)作了功能強(qiáng)大的iterator。

但是,PHP5開始支持了接口, 并且內(nèi)置了Iterator接口, 所以如果你定義了一個(gè)類,并實(shí)現(xiàn)了Iterator接口,那么你的這個(gè)類對(duì)象就是ZEND_ITER_OBJECT,否則就是ZEND_ITER_PLAIN_OBJECT。對(duì)于ZEND_ITER_PLAIN_OBJECT的類,foreach會(huì)通過HASH_OF獲取該對(duì)象的默認(rèn)屬性數(shù)組,然后對(duì)該數(shù)組進(jìn)行foreach,而對(duì)于ZEND_ITER_OBJECT的類對(duì)象,則會(huì)通過調(diào)用對(duì)象實(shí)現(xiàn)的Iterator接口相關(guān)函數(shù)來進(jìn)行foreach。

咱們什么也別說,先來看下迭代器的定義,那就是提供一種方法順序訪問一個(gè)聚合對(duì)象中各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部顯示。它可幫助構(gòu)造特定的對(duì)象,那些對(duì)象能夠提供單一標(biāo)準(zhǔn)接口循環(huán)或迭代任何類型的可計(jì)數(shù)數(shù)據(jù)。來看下迭代器模式的結(jié)構(gòu)圖:

PHP設(shè)計(jì)模式之迭代器(Iterator)模式入門與應(yīng)用詳解

咋樣,反正我現(xiàn)在是一頭霧水。。。

再來看下迭代器需要用到的內(nèi)部方法:

  • Iterator::current ― Return the current element 返回當(dāng)前元素
  • Iterator::key ― Return the key of the current element 返回當(dāng)前元素的鍵
  • Iterator::next ― Move forward to next element 移向下一個(gè)元素
  • Iterator::rewind ― Rewind the Iterator to the first element 重新回到第一個(gè)元素
  • Iterator::valid ― Checks if current position is valid 檢查當(dāng)前位置的有效性

咱不廢話哈,直接來看下網(wǎng)上比較經(jīng)典的一個(gè)實(shí)例:

class MyIterator implements Iterator
{
   private $var = array();
 
   public function __construct($array)
   {
     if (is_array($array)) {
      $this->var = $array;
     }
   }
 
   public function rewind() {
     echo "倒回第一個(gè)元素
";
    reset($this->var);
   }
 
   public function current() {
    $var = current($this->var);
     echo "當(dāng)前元素: $var
";
     return $var;
   }
 
   public function key() {
    $var = key($this->var);
     echo "當(dāng)前元素的鍵: $var
";
     return $var;
   }
 
   public function next() {
    $var = next($this->var);
     echo "移向下一個(gè)元素: $var
";
     return $var;
   }
 
 
   public function valid() {
    $var = $this->current() !== false;
     echo "檢查有效性: {$var}
";
     return $var;
   }
}
 
 
$values = array(1,2,3);
$it = new MyIterator($values);
foreach ($it as $k => $v) {
   print "此時(shí)鍵值對(duì) -- key $k: value $v

";
}

運(yùn)行之后的結(jié)果如下:

PHP設(shè)計(jì)模式之迭代器(Iterator)模式入門與應(yīng)用詳解

我們可以想一下,如果把集合對(duì)象和對(duì)集合對(duì)象的操作放在一起,當(dāng)我們想換一種方式遍歷集合對(duì)象中元素時(shí),就需要修改集合對(duì)象了,違背“單一職責(zé)原則”,而迭代器模式將數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)的算法分離開,兩者可獨(dú)立發(fā)展。

來看下迭代器的優(yōu)點(diǎn):

1.支持多種遍歷方式。比如有序列表,我們根據(jù)需要提供正序遍歷、倒序遍歷兩種迭代器。用戶只需要得到我們的迭代器,就可以對(duì)集合執(zhí)行遍歷操作

2.簡(jiǎn)化了聚合類。由于引入了迭代器,原有的集合對(duì)象不需要自行遍歷集合元素了

3.增加新的聚合類和迭代器類很方便,兩個(gè)維度上可各自獨(dú)立變化

4.為不同的集合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口,從而支持同樣的算法在不同的集合結(jié)構(gòu)上操作

缺點(diǎn)就是迭代器模式將存儲(chǔ)數(shù)據(jù)和遍歷數(shù)據(jù)的職責(zé)分離增加新的集合對(duì)象時(shí)需要增加對(duì)應(yīng)的迭代器類,類的個(gè)數(shù)成對(duì)增加,在一定程度上增加系統(tǒng)復(fù)雜度。

它的使用場(chǎng)景,我們可以參考如下幾點(diǎn):

1.訪問一個(gè)聚合對(duì)象內(nèi)容而無須暴露它的內(nèi)部顯示

2.需要為聚合對(duì)象提供多種遍歷方式

3.為遍歷不同的聚合結(jié)構(gòu)提供一個(gè)統(tǒng)一的接口

我們要知道,最基本的迭代器接口是Iterator,來看下Iterator里面規(guī)范的方法:

Iterator extends Traversable {
  /* 方法 */
  abstract public mixed current ( void )//返回當(dāng)前元素
  abstract public scalar key ( void )//返回當(dāng)前元素的鍵
  abstract public void next ( void )//向前移動(dòng)到下一個(gè)元素
  abstract public void rewind ( void )//返回到迭代器的第一個(gè)元素
  abstract public boolean valid ( void )//檢查當(dāng)前位置是否有效
}

完事,我們?nèi)绻M(jìn)行遍歷的類必須實(shí)現(xiàn)Iterator里面的抽象方法,如下:

class Season implements Iterator{
  private $position = 0;//指針指向0
  private $arr = array("春","夏","秋","冬");
  public function rewind(){
    return $this -> position = 0;
  }
  public function current(){
    return $this -> arr[$this -> position];
  }
  public function key(){
    return $this -> position;
  }
  public function next() {
    ++$this -> position;
  }
 
  public function valid() {
    return isset($this -> arr[$this -> position]);
  }
}
$obj = new Season;
foreach ($obj as $key => $value) {
  echo $key.":".$value."
";
}

最后,咱們來看一個(gè)網(wǎng)上找的用迭代器模式來實(shí)現(xiàn)的一個(gè)斐波那契數(shù)列。

我們都知道,斐波那契數(shù)列通常做法是用遞歸實(shí)現(xiàn),當(dāng)然還有其它的方法,咱們這里用PHP的迭代器來實(shí)現(xiàn)一個(gè)斐波納契數(shù)列,幾乎沒有什么難度,只是把類里的next()方法重寫了一次。注釋已經(jīng)寫到代碼中,也是相當(dāng)好理解的,如下:

class Fibonacci implements Iterator {
  private $previous = 1;
  private $current = 0;
  private $key = 0;
   
  public function current() {
    return $this->current;
  }
   
  public function key() {
    return $this->key;
  }
   
  public function next() {
    // 關(guān)鍵在這里
    // 將當(dāng)前值保存到 $newprevious
    $newprevious = $this->current;
    // 將上一個(gè)值與當(dāng)前值的和賦給當(dāng)前值
    $this->current += $this->previous;
    // 前一個(gè)當(dāng)前值賦給上一個(gè)值
    $this->previous = $newprevious;
    $this->key++;
  }
   
  public function rewind() {
    $this->previous = 1;
    $this->current = 0;
    $this->key = 0;
  }
   
  public function valid() {
    return true;
  }
}
 
$seq = new Fibonacci;
$i = 0;
foreach ($seq as $f) {
  echo "$f ";
  if ($i++ === 15) break;
}

輸出的結(jié)果如下:

0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610

好啦,本次記錄就到這里了。

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

原文鏈接:https://blog.csdn.net/luyaran/article/details/82867878

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美日韩亚洲区久久综合 | 91免费精品国自产拍在线可以看 | 日韩视频免费观看 | 日本卡1卡2卡4卡免费 | 高h文道具 | 日本全黄三级在线观看 | 校花在公车上被内射好舒服 | 操乳 | 帅老头恋帅老头同性tv | 午夜国产福利视频一区 | 国产一区二区三区高清 | 男女拍拍拍免费视频网站 | 97久久天天综合色天天综合色hd | 国产原创精品 | 亚洲AV中文字幕无码久久 | 99美国热| 亚洲乱码一区二区三区国产精品 | 四虎精品永久在线网址 | 欧美男男gaysgays | 亚洲男女在线 | 亚洲大片免费看 | 毛片免费在线视频 | 国产亚洲综合精品一区二区三区 | 特级淫片欧美高清视频蜜桃 | 亚洲国产货青视觉盛宴 | 成人资源影音先锋久久资源网 | 国产第2页| 女主被当众调教虐np | 精品女同一区二区三区免费站 | 国产午夜精品久久久久小说 | 免费特黄一区二区三区视频一 | 国产精品www夜色影视 | 五月婷婷丁香在线视频 | 边摸边吃奶玩乳尖视频 | 性做久久久久久久久老女人 | 精品91自产拍在线 | 久久久GOGO无码啪啪艺术 | japanesexxxx日本妞 | 国产在线观看网站 | 99久久综合给久久精品 | 91大片淫黄大片在线天堂 |