web development blog

> 编程 PHP设计模式之迭代器模式

php设计模式笔记,第十二个是迭代器模式,也叫游标模式。定义:提供一种方法访问一个聚合对象中各个元素,而又不暴露该对象的内部细节。

此模式我们比较熟悉,因为对于php数组我相信大家都不陌生。其实数组类型的遍历,读取操作就是迭代器模式。而现在我们要实现的就是类似数组那样来操作我们的聚合对象各个元素。

 

主要角色:

抽象聚合对象:聚合定义创建相应迭代器对象的接口

具体聚合对象:实现抽象聚合对象接口,创建放回一个迭代器实例

抽象迭代器:定义访问和遍历集合对象的接口

具体迭代器:实现抽象迭代器的接口

 

实现的方式:

一、实现spl标准类库的Iterator 和IteratorAggregate内置接口

二、自己实现抽象聚合对象,抽象迭代器,具体聚合对象,具体迭代器

 

关键要理解的是:抽象集合对象明确规定具体聚合对象要有一个方法返回一个迭代器实例,并把自己为参数实例化;而迭代器具体类则实现遍历等操作方法,并有个游标下标属性,记录当前聚合对象引索。

具体代码如下:

/**
 * PHP设计模式 之 迭代器模式
 * @website wmhfly.com
 */

/**
 * 抽象迭代器接口
 */
interface IIterator {
	/**
	 * 返回当前元素
	 */
	public function current();
	
	/**
	 * 游标向前移动
	 */
	public function next();
	
	/**
	 * 返回到迭代器的第一个元素
	 */
	public function rewind();
	
	/**
	 * 检测当前位置是否有效
	 */
	public function valid();
	
}

/**
 * 具体迭代器类
 */
class ContreteIterator implements IIterator{
	/**
	 * 聚合对象
	 * @var Object
	 */
	private $aggregate;
	/**
	 * 游标下标位置
	 * @var int
	 */
	private $postion;
	/**
	 * 聚合对象的长度
	 * @var int
	 */
	private $len;
	
	/**
	 * 构造函数
	 * @param Object $aggregate
	 */
	public function __construct($aggregate){
		$this->aggregate = $aggregate;
		$this->len = $this->aggregate->getLength();
	}
	
	/**
	 * 实现:返回当前元素
	 * 提示:间接实现,由具体聚合类的方法实现
	 * @see IIterator::current()
	 */
	public function current(){
		if($this->postion<$this->len)
        	return $this->aggregate->getAt($this->postion);
	}
	
	/**
	 * 实现: 游标向前移动
	 * @see IIterator::next()
	 */
	public function next(){
		if($this->postion<$this->len) $this->postion++;
	}
	
	/**
	 * 实现: 返回到迭代器的第一个元素
	 * @see IIterator::rewind()
	 */
	public function rewind(){
		$this->postion = 0;
	}
	
	/**
	 * 实现: 检测当前位置是否有效
	 * @see IIterator::valid()
	 */
	public function valid(){
		return ($this->postion<$this->len) ? true : false;
	}
	
}


/**
 * 抽象聚合接口
 */
interface IAggregate {
	/**
	 * 创建迭代器
	 */
	public function createIterator();
	/**
	 * 返回当前聚合对象
	 */
	public function getAt($postion);
	/**
	 * 返回聚合对象的长度
	 */
	public function getLength();
}

/**
 * 具体聚合类
 */
class ContreteAggregate implements IAggregate{
	/**
	 * 存储被迭代对象
	 * @var array
	 */
	private $_collection;
	
	/**
	 * 构造函数
	 * @param array $collection
	 */
	public function __construct($collection){
		$this->_collection = $collection;
	}
	
	/**
	 * 返回迭代器实例
	 * @see IAggregate::createIterator()
	 */
	public function createIterator(){
		return new ContreteIterator($this);
	}
	
	/**
	 * 返回当前元素
	 * @see IAggregate::getAt($postion)
	 */
	public function getAt($postion){
		return $this->_collection[$postion];
	}
	/**
	 * 返回聚合对象的长度
	 * @see IAggregate::getLength()
	 */
	public function getLength(){
		return count($this->_collection);
	}
}

/**
 * 迭代器模式 DEMO
 */
$collection = array('对象一','对象二','对象三');
$agg = new ContreteAggregate($collection);
$iterator = $agg->createIterator();
$iterator->rewind();
while ($iterator->valid()){
	echo $iterator->current();
	$iterator->next();
}

迭代器模式演示源文件下载.

-留言评论-

  • 留言载入中...

-拍砖-

 

首页|前端技术|编程/php|生活|关于我

Copyright © 2012 wmhfly.com