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 相关文章推荐
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
javascript 小型动画组件与实现代码
Jun 02 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
php数组合并的二种方法
Mar 21 PHP
php中Y2K38的漏洞解决方法实例分析
Sep 22 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
PHP生成及获取JSON文件的方法
Aug 23 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
php workerman定时任务的实现代码
Dec 23 PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 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
多人战的战术与战略
2020/03/04 星际争霸
PHPMailer邮件发送的实现代码
2013/05/04 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
Javascript 面向对象编程(一) 封装
2011/08/28 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
封装html的select标签的js操作实例
2013/07/02 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
2013/08/07 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
jQuery实现的向下图文信息滚动效果
2015/05/03 Javascript
javascript实现base64 md5 sha1 密码加密
2015/09/09 Javascript
网页前端登录js按Enter回车键实现登陆的两种方法
2016/05/10 Javascript
js将json格式的对象拼接成复杂的url参数方法
2016/05/25 Javascript
AngularJS 中的事件详解
2016/07/28 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
vue router总结 $router和$route及router与 router与route区别
2019/07/05 Javascript
JavaScript实现多个物体同时运动
2020/03/12 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
jQuery插件实现图片轮播效果
2020/10/19 jQuery
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
python组合无重复三位数的实例
2018/11/13 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
一名毕业生的自我鉴定
2013/12/04 职场文书
优良学风班申请材料
2014/02/13 职场文书
教师考核鉴定意见
2015/06/05 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
基于Redission的分布式锁实战
2022/08/14 Redis