php设计模式之迭代器模式实例分析【星际争霸游戏案例】


Posted in PHP onApril 07, 2020

本文实例讲述了php设计模式之迭代器模式。分享给大家供大家参考,具体如下:

星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿。

我们自然会想到把电脑的农民放到一个数组,然后一旦玩家造兵,或者战斗打响,把这个数组循环,让里面的农民采矿。

但问题出来了,由于每个任务的设定会有所不同,我们总希望任务的开发比较方便,而且容易修改(一旦发现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()函数,这样即使不用数组存放农民,也不需要改动聚集类以外的代码。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
配置PHP使之能同时支持GIF和JPEG
Oct 09 PHP
PHP中一个控制字符串输出的函数
Oct 09 PHP
PHP 函数执行效率的小比较
Oct 17 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
php的大小写敏感问题整理
Dec 29 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
php使用多个进程同时控制文件读写示例
Feb 28 PHP
php中error与exception的区别及应用
Jul 28 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
Oct 30 PHP
php使用curl简单抓取远程url的方法
Mar 13 PHP
PHP获取一年有几周以及每周开始日期和结束日期
Aug 06 PHP
yii2中的rules 自定义验证规则详解
Apr 19 PHP
解决Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]
Apr 06 #PHP
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
Apr 06 #PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
Apr 06 #PHP
Laravel 5+ .env环境配置文件详解
Apr 06 #PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 #PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
Apr 06 #PHP
使用git迁移Laravel项目至新开发环境的步骤详解
Apr 06 #PHP
You might like
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
学习PHP session的传递方式
2016/06/15 PHP
Jquery 常用方法经典总结
2010/01/28 Javascript
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
jquery解析JSON数据示例代码
2014/03/17 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
jquery实现浮动在网页右下角的彩票开奖公告窗口代码
2015/09/04 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
详解小程序退出页面时清除定时器
2019/04/28 Javascript
[57:22]完美世界DOTA2联赛PWL S2 FTD vs PXG 第二场 11.27
2020/12/01 DOTA
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
Python绘制热力图示例
2019/09/27 Python
Django查询优化及ajax编码格式原理解析
2020/03/25 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
python 下载文件的几种方法汇总
2021/01/06 Python
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
10条PHP编程习惯
2014/05/26 面试题
Linux如何压缩可执行文件
2013/10/21 面试题
中科创达面试题
2016/12/28 面试题
楼面经理岗位职责范本
2014/02/18 职场文书
原材料检验岗位职责
2014/03/15 职场文书
施工安全协议书范本
2014/09/26 职场文书
教师党员自我剖析材料
2014/09/29 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
python 命令行传参方法总结
2021/05/25 Python
微软PC Health Check电脑健康状况检查应用下载(Win11配置检测工具)
2021/06/26 数码科技
windows server2008 开启端口的实现方法
2022/06/25 Servers