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