PHP设计模式--迭代器模式

  迭代器模式(Iterator) 是一种对象行为型模式,使用频率很高。

 最常见的使用就是通过遍历功能把数据从聚合对象中分离出来。

 迭代器也是操作聚合对象的基本手段,包括的方法有:获取第一个元素的First(),访问下一个元素的Next(),判断是否还有下一个元素的IsExist(),获取当前元素的currentItem()。

 有点类似于把数组转变成单个字符串的过程。

 包含一个抽象迭代器和一个具体迭代器,代码如下:

<?php  
echo "<pre>";  
// 迭代器模式 index.php  
header("Content-Type:text/html;charset=utf-8");  
  
  
require_once "Iterator.php";  
echo "-------------------数组-------------------<br/>";  
// 构建数组  
$arr = array("one","two","three");  
print_r($arr);  
  
  
// 传值进迭代器  
$iterator = new ConcreteIterator($arr);  
  
  
echo "------------------第一个数-----------------<br/>";  
// 取出第一个数  
echo $iterator->First()."<br/>";  
  
  
echo "------------------遍历输出-----------------<br/>";  
// 剥离数组 循环输出  
while (!$iterator->IsExist())  
{  
<span style="white-space:pre;"> </span>// 输出当前数据  
<span style="white-space:pre;"> </span>echo "{$iterator->CurrentItem()}<br/>";  
  
  
    // 指到下个数据  
<span style="white-space:pre;"> </span>$iterator->Next();  
}  
<?php  
  
// 抽象迭代器  
abstract Class IIterator  
{  
    /** 
     * 获取第一个元素 
     * @access public  
     */  
    abstract function First();  
  
    /** 
     * 访问下一个元素 
     * @access public  
     */  
    abstract function Next();         
  
    /** 
     * 判断是否还有下一个元素 
     * @access public  
     */  
    abstract function IsExist();      
  
    /** 
     * 获取当前元素 
     * @access public  
     */  
    abstract function currentItem();  
}  
  
// 具体迭代器  
Class ConcreteIterator extends IIterator  
{  
    /** 
     * 数据数组 
     * @var array 
     */  
    private $aggre;  
  
    /** 
     * 游标(数组下标) 
     * @var int 
     */  
    private $curr = 0;   
  
    /** 
     * 构造方法 
     * @access public  
     * @param  array $_aggre 数组值 
     */  
    function __construct($_aggre)  
    {  
        $this->aggre = $_aggre;  
    }  
  
    /** 
     * 获取第一个元素方法 
     * @access public  
     */  
    function First()  
    {  
        return $this->aggre[0];  
    }  
  
    /** 
     * 获取下一个元素方法 
     * @access public  
     */  
    function Next()  
    {  
        $this->curr++;  
        if($this->curr<count($this->aggre))  
        {  
            return true;  
        }  
        return false;  
    }  
  
    /** 
     * 检测存在值方法 
     * @access public  
     */  
    function IsExist()  
    {  
        return $this->curr>=count($this->aggre)?true:false;  
    }   
  
    /** 
     * 获取当前数据方法 
     * @access public  
     */  
    function currentItem()  
    {  
        return $this->aggre[$this->curr];  
    }                     
}  

输出结果:

-------------------数组-------------------
Array
(
    [0] => one
    [1] => two
    [2] => three
)
------------------第一个数-----------------
one
------------------遍历输出-----------------
one
two
three


猜你喜欢

转载自blog.csdn.net/xhanguomzhu/article/details/79986447