19. 星际争霸之php设计模式--迭代器模式

题记
==============================================================================
本php设计模式专辑来源于博客(jymoz.com),现在已经访问不了了,这一系列文章是我找了很久才找到完整的,感谢作者jymoz的辛苦付出哦!

本文地址:http://www.cnblogs.com/davidhhuan/p/4248206.html
==============================================================================


星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿。
我们自然会想到把电脑的农民放到一个数组,然后一旦玩家造兵,或者战斗打响,把这个数组循环,让里面的农民采矿。
但问题出来了,由于每个任务的设定会有所不同,我们总希望任务的开发比较方便,而且容易修改(一旦发现bug)。
何况有些任务不是农民采矿,而是电脑出兵攻击玩家。
那么过多的固定细节(用数组存放)以及依赖细节(对数组循环),将使得代码的关联性变得很高。

待解决的问题:把循环处理的事务变的抽象。

思路:关键是对农民的循环,用数组处理只是一种方式,我们考虑抽象的数组,而不是具体的数组。

迭代器(Iterator)模式示例:

<?php
    //聚集接口,意思是所有电脑的农民都聚集在这个类里面
    interface IAggregate
    {
        //让具体的聚集类实现的,获取使用的迭代器的方法
        public function createIterator();
    }

    //具体的聚集类
    class ConcreteAggregate implements IAggregate
    {
        //存放农民的数组,注意可以不用数组来处理,看完所有的代码就知道了
        public $workers;

        //增加元素的方法,这里元素就是农民
        public function addElement($element)
        {
            $this->workers[] = $element;
        }

        //获取元素的方法
        public function getAt($index)
        {
            return $this->workers[$index];
        }

        //获取元素的数量的方法
        public function getLength()
        {
            return count($this->workers);
        }

        //获取迭代器的方法
        public function createIterator()
        {
            return new ConcreteIterator($this);
        }
    }

    //迭代器接口,注意php5有个内置的接口叫Iterator,所以这里我们改成IIterator
    interface IIterator
    {
        //是否元素循环完毕
        public function hasNext();

        //返回下一个元素,并将指针加1
        public function next();
    }

    //具体的迭代器类
    class ConcreteIterator implements IIterator
    {
        //要迭代的集合
        public $collection;

        //指针
        public $index;

        //构造函数,确定迭代的集合,并将指针置零
        public function __construct($collection)
        {
            $this->collection = $collection;
            $this->index = 0;
        }

        //是否元素循环完毕
        public function hasNext()
        {
            if($this->index < $this->collection->getLength())
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //返回下一个元素,并将指针加1
        public function next()
        {
            $element = $this->collection->getAt($this->index);
            $this->index++;
            return $element;
        }
    }

    //初始化电脑的农民的聚集对象
    $farmerAggregate = new ConcreteAggregate();

    //添加农民,这里简单的用字符串表示
    $farmerAggregate->addElement('SVC1');
    $farmerAggregate->addElement('SVC2');

    //获取迭代器
    $iterator = $farmerAggregate->createIterator();

    //将农民聚集对象循环
    while ($iterator->hasNext())
    {
        //获取下一个农民
        $element = $iterator->next();
        //我们简单的输出
        echo $element;
    }
?>

 

用途总结:迭代器模式建立了类似数组的形式,从上面的代码可以看到,如果要修改循环的处理,或者修改被循环的集合,都不必修改其它相关的代码。

实现总结:需要一个管理聚集的类,比如上面的ConcreteAggregate。另外需要迭代器类,比如上面的ConcreteIterator。然后把所有的操作,比如添加元素,获取下一个元素,指针之类的数组方面的操作抽象出来,这样其它的代码只要使用方法,比如getLength(),而不是细节化的count()函数,这样即使不用数组存放农民,也不需要改动聚集类以外的代码。

 

相关文章:

 

1. 星际争霸之php面向对象(一)

2. 星际争霸之php面向对象(二)

3. 星际争霸之php设计模式--简单工厂模式

4. 星际争霸之php设计模式--工厂方法模式

5. 星际争霸之php设计模式--抽象工厂模式

6. 星际争霸之php设计模式--建造器模式

7. 星际争霸之php设计模式--中介者模式

8. 星际争霸之php设计模式--享元模式

9. 星际争霸之php设计模式--代理模式

10. 星际争霸之php设计模式--原型模式

11. 星际争霸之php设计模式--备忘模式

12. 星际争霸之php设计模式--模板模式

13. 星际争霸之php设计模式--正面模式

14. 星际争霸之php设计模式--状态模式

15. 星际争霸之php设计模式--策略模式

16. 星际争霸之php设计模式--组合模式

17. 星际争霸之php设计模式--职责链模式

18. 星际争霸之php设计模式--观察者模式

19. 星际争霸之php设计模式--迭代器模式

20. 星际争霸之php设计模式--适配器模式

posted @ 2015-01-25 14:35 DavidHHuan 阅读(...) 评论(...) 编辑 收藏