php实现设计模式之 迭代器模式

<?php
/*迭代器模式: 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。(行为模式)
 *
 1.迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。
 2.具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。
 3.集合角色(Aggregate):集合角色负责提供创建具体迭代器角色的接口。
 4.具体集合角色(Concrete Aggregate):具体集合角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该集合的结构相关。
 */

/**
 * 迭代器接口,定义访问和遍历元素的操作
 */
interface IIterator{
	//移动到聚合对象的第一个元素位置
	public function first();
	//移动到聚合对象的下一个元素位置
	public function next();
	
	/**
	 * 判断是否已经移动到聚合对象的最后一个位置
	 * true 表示移动到了聚合对象的最后一个位置
	 * false 表示还没有移动到聚合对象的最后一个位置
	 */
	public function isDone();
	
	
	/**
	 * 取得迭代的当前元素  
	 * 返回迭代的当前元素
	 */
	public function currentItem();
}
 
/**
 * 具体的迭代器实现对象,示意的是聚合对象为数组的迭代器
 * 不同的聚合对象相应的迭代器的实现是不同的
 */
 
class ConcreteIterator implements IIterator{
	//持有被迭代的具体聚合对象
	private $aggregate;
	/**
	 * 内部索引,记录当前迭代到的索引位置
	 * -1表示刚刚开始的时候,迭代器指向聚合对象第一个对象之前
	 */
	private $index = -1;
	private $aggregateCount = null;
	/**
	 * 构造函数,传入被迭代的具体聚合对象
	 * @param $aggregate 被迭代的具体聚合对象
	 */
	public function __construct($aggregate){
		$this->aggregate = $aggregate;
		$this->aggregateCount = $this->aggregate->getCounts();
	}
	 
	public function first(){
		$this->index = 0;
	}
	 
	public function next(){
		if($this->index < $this->aggregateCount){
			$this->index = $this->index + 1;
		}
	}
	 
	public function isDone(){
		if($this->index == $this->aggregateCount){
			return true;
		}
		return false;
	}
	 
	public function currentItem(){
		return $this->aggregate->getItem($this->index);
	}
	 
	public function getAggregateCount(){
		return $this->aggregateCount;
	}
}
 
/**
 * 聚合对象的抽象类,定义了创建相应迭代器对象的接口,每一个实现该聚合对象抽象类的对象都要实现这个抽象方法
 */
abstract class Aggregate{
	public abstract function createIterator();
}
 
/**
 * 具体的聚合对象,实现创建相应迭代器对象的功能
 */
class ConcreteAggregate extends Aggregate{
	//聚合对象的具体内容
	private $arrayAgg = null;
	 
	/**
	 * 构造函数:传入聚合对象具体的内容,在这个例子中是数组
	 * @param $arrayAgg 聚合对象的具体内容
	 */
	 
	public function __construct($arrayAgg){
		$this->arrayAgg = $arrayAgg;
	}
	 
	public function createIterator(){
		//实现创建Iterator的工厂方法
		return new ConcreteIterator($this);
	}
	 
	public function getItem($index){
		if($index < sizeof($this->arrayAgg)){
			return $this->arrayAgg[$index];
		}
	}
	 
	public function getCounts(){
		return sizeof($this->arrayAgg);
	}
}
 
/**
 * 看看具体的使用方法
 */
$aggregate = new ConcreteAggregate(array('张三','李四','王五'));
$iterator = $aggregate->createIterator();
 
$iterator->first();

while(!$iterator->isDone()){
	$obj = $iterator->currentItem();
	echo "The obj == ".$obj."<br>";
	$iterator->next();
}
?>

  UML

posted @ 2014-11-04 16:05  tai君  阅读(210)  评论(0编辑  收藏  举报