• PHP设计模式


    迭代器模式 (Iterator),又叫做游标(Cursor)模式。提供一种方法访问一个容器(Container)对象中各个元素,而又不需暴露该对象的内部细节。

    当你需要访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑使用迭代器模式。另外,当需要对聚集有多种方式遍历时,可以考虑去使用迭代器模式。迭代器模式为遍历不同的聚集结构提供如开始、下一个、是否结束、当前哪一项等统一的接口。

    php标准库(SPL)中提供了迭代器接口 Iterator,要实现迭代器模式,实现该接口即可。

    <?php
    class sample implements Iterator {
        private $_items ;
    
        public function __construct(&$data) {
            $this->_items = $data;
        }
        public function current() {
            return current($this->_items);
        }
    
        public function next() {
            next($this->_items);   
        }
    
        public function key() {
            return key($this->_items);
        }
    
        public function rewind() {
            reset($this->_items);
        }
    
        public function valid() {                                                                              
            return ($this->current() !== FALSE);
        }
    }
    
    // client
    $data = array(1, 2, 3, 4, 5);
    $sa = new sample($data);
    foreach ($sa AS $key => $row) {
        echo $key, ' ', $row, '<br />';
    }
    /* 输出:
    0 1
    1 2
    2 3
    3 4
    4 5 */
    
    //Yii FrameWork Demo
    class CMapIterator implements Iterator {
    /**
    * @var array the data to be iterated through
    */
        private $_d;
    /**
    * @var array list of keys in the map
    */
        private $_keys;
    /**
    * @var mixed current key
    */
        private $_key;
    
    /**
    * Constructor.
    * @param array the data to be iterated through
    */
        public function __construct(&$data) {
            $this->_d=&$data;
            $this->_keys=array_keys($data);
        }
    
    /**
    * Rewinds internal array pointer.
    * This method is required by the interface Iterator.
    */
        public function rewind() {                                                                                 
            $this->_key=reset($this->_keys);
        }
    
    /**
    * Returns the key of the current array element.
    * This method is required by the interface Iterator.
    * @return mixed the key of the current array element
    */
        public function key() {
            return $this->_key;
        }
    
    /**
    * Returns the current array element.
    * This method is required by the interface Iterator.
    * @return mixed the current array element
    */
        public function current() {
            return $this->_d[$this->_key];
        }
    
    /**
    * Moves the internal pointer to the next array element.
    * This method is required by the interface Iterator.
    */
        public function next() {
            $this->_key=next($this->_keys);
        }
    
    /**
    * Returns whether there is an element at current position.
    * This method is required by the interface Iterator.
    * @return boolean
    */
        public function valid() {
            return $this->_key!==false;
        }
    }
    
    $data = array('s1' => 11, 's2' => 22, 's3' => 33);
    $it = new CMapIterator($data);
    foreach ($it as $row) {
        echo $row, '<br />';
    }
    
    /* 输出:
    11
    22
    33 */
    ?>
    
  • 相关阅读:
    刚学的 activity 之间的两种(带数据)跳转
    SharePreference 把少量数据写到 文件中
    Android 使用资源
    SQLite 初步测试
    android 操作 sd 卡上的文件
    android 操作文件
    002android 布局(layout)
    Activity_liftCycle — 生命周期
    android 创建、删除 文件和文件夹 测试
    android 实现粗糙的文件浏览器
  • 原文地址:https://www.cnblogs.com/taozi32/p/9226824.html
Copyright © 2020-2023  润新知