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 array_slice函数的使用以及参数详解
Aug 30 PHP
PHP 类型转换函数intval
Jun 20 PHP
php引用地址改变变量值的问题
Mar 23 PHP
php中隐形字符65279(utf-8的BOM头)问题
Aug 16 PHP
一个经典实用的PHP图像处理类分享
Nov 18 PHP
Yii获取当前url和域名的方法
Jun 08 PHP
PHP实现的购物车类实例
Jun 17 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
PHP使用socket发送HTTP请求的方法
Feb 14 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
Jul 22 PHP
PHP实现微信申请退款功能
Oct 01 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
玩转虚拟域名◎+ .
2006/10/09 PHP
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
ThinkPHP3.1新特性之字段合法性检测详解
2014/06/19 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
PHP微信支付实例解析
2016/07/22 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
详细分析PHP 命名空间(namespace)
2020/06/30 PHP
firebug的一个有趣现象介绍
2011/11/30 Javascript
jquery获取焦点和失去焦点事件代码
2013/04/21 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
用jQuery.ajaxSetup实现对请求和响应数据的过滤
2016/12/20 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
详解angular中通过$location获取路径(参数)的写法
2017/03/21 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
微信小程序Page中data数据操作和函数调用方法
2019/05/08 Javascript
Antd下拉选择,自动匹配功能的实现
2020/10/24 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
Python编写屏幕截图程序方法
2015/02/18 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
使用python存储网页上的图片实例
2018/05/22 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
2014年社区庆元旦活动方案
2014/03/08 职场文书
精彩广告词大全
2014/03/19 职场文书
新品发布会策划方案
2014/06/08 职场文书
2014年团委工作总结
2014/11/13 职场文书
个人股份转让协议书范本
2015/01/28 职场文书
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python