<?php
/**
* 江湖人称迭代器模式
* 迭代器模式将遍历和数据分开,遍历不需要了解细节(你是数组呢,还是链表呢)
* 由于不需要了解细节,可以为不同的数据结构提供相同的遍历接口
* 可以为同一结构提供不同的遍历,列如逆序
* Class product
*/
abstract class product{
protected $product = [];
public function __construct(array $product)
{
$this->product = $product;
}
public function add($value){
array_push($this->product,$value);
}
public function getObject(){
return $this->product;
}
//迭代
public abstract function createIteration();
}
interface Iteration{
public function next();
public function isLast();
}
class productIteration implements Iteration{
protected $object;
protected $current;
protected $max_key;
public function __construct(productList $object)
{
$this->object = $object->getObject();
$this->current = -1;
$this->max_key = count($this->object);
}
public function isLast(){
return $this->current == $this->max_key - 1;
}
public function isFirst(){
return $this->current == 0;
}
public function next(){
$this->current++;
return $this->object[$this->current];
}
public function first(){
$this->current --;
return $this->object[$this->current];
}
}
class productList extends product{
public function createIteration(){
return new productIteration($this);
}
}
class Factory{
public static function build(){
$arr = [
'从',
'前',
'明',
'月',
'光',
'疑',
'似',
'地',
'上',
'霜'
];
return new productList($arr);
}
}
$product = Factory::build();
$product->add('你的才华配不上你的野心');
$iteration = $product->createIteration();
//正序
while(!$iteration->isLast()){
echo $iteration->next().'<br/>';
}
//逆序
while(!$iteration->isFirst()){
echo $iteration->first().'<br/>';
}