Iterator_迭代器模式_PHP语言描述

感觉最近写的这些设计模式的例子,在定义描述方面差很多,以后都会先写一下用例设计模式的定义及简单讲解,在把例子附上,这样的感觉更好些,也让大家看得更清楚一些。

Iterator_迭代器模式的定义:

提供一种方法可以顺序的访问一个聚合对象中的集合,而不外露该对象的内部表示。

所谓的聚合是指一组对象的组合结构:比如数组,LIST,QUEUE等等(在PHP中得SPL库中,有完善的各类高级数据结构以及Iterator接口及其实现已方便PHP的foreach循环访问)。

Iterator_迭代器模式解决问题的思路:

仔细阅读上面的定义,我们可以知道我们需要一个统一的方法来访问各种实现不同的聚合对象。那么首先我们需要把这个统一的访问方法抽象并定义出来,按照这个统一的访问方式定义出来的接口在迭代器模式中对应的就是Iterator接口。

接下来就该考虑如何创建迭代器了,由于迭代器和相应的聚合对象紧密相关,因此应该让具体的聚合对象来负责创建相应的迭代器。

Iterator(interface):迭代器接口,用于抽象定义访问和遍历元素的接口。

ConcreteIterator(class implements Iterator interface):具体的迭代器实现类,实现对聚合对象的遍历,并跟踪遍历对象的各种索引及当前位置。

Aggregate(abstract class):聚合对象的抽象类,定义创建相应迭代器对象的接口。

ConcreteAggregate(class extends Aggregate):具体的聚合对象的实现类,实现创建相应的迭代器对象。

注:不同类型的聚合对象的实现类,需要实现不同的相应的迭代器类。

具体例子:

<?php
	/**
	 * 迭代器接口,定义访问和遍历元素的操作 
	 */
	interface IIterator{
		//移动到聚合对象的第一个元素位置
		public function first();
		//移动到聚合对象的下一个元素位置
		public function next();
		/**
		 * 判断是否已经移动到聚合对戏那个的最后一个位置
		 * @return  trun 表示移动到了聚合对象的最后一个位置
		 * @return  false 表示还没有移动到聚合对象的最后一个位置
		 */
		public function isDone();
		/**
		 * 取得迭代的当前元素
		 * @return  返回迭代的当前元素
		 */
		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();
	}
?>


你可能感兴趣的:(PHP,iterator,迭代器模式)