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 相关文章推荐
CodeIgniter安全相关设置汇总
Jul 03 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
php中删除、清空session的方式总结
Oct 09 PHP
yii2实现根据时间搜索的方法
May 25 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
Jun 19 PHP
thinkphp 中的volist标签在ajax操作中的特殊性(推荐)
Jan 15 PHP
Yii框架日志操作图文与实例详解
Sep 09 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
Apr 14 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数组函数序列之array_sum() - 计算数组元素值之和
2011/10/29 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
Table冻结表头示例代码
2013/08/20 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
2014/06/23 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
JavaScript基于setTimeout实现计数的方法
2015/05/08 Javascript
谈谈JavaScript类型系统之Math
2016/01/06 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
node作为中间服务层如何发送请求(发送请求的实现方法详解)
2018/01/02 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
[54:51]Ti4 冒泡赛第二轮LGD vs C9 3
2014/07/14 DOTA
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
详解Python中的__getitem__方法与slice对象的切片操作
2016/06/27 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
python多进程使用函数封装实例
2020/05/02 Python
Django视图类型总结
2021/02/17 Python
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
竞赛口号大全
2014/06/16 职场文书
二审答辩状格式
2015/05/22 职场文书
教你使用VS Code的MySQL扩展管理数据库的方法
2022/01/22 MySQL