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 相关文章推荐
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
Oct 31 PHP
PHP5中虚函数的实现方法分享
Apr 20 PHP
PHP5常用函数列表(分享)
Jun 07 PHP
提升PHP性能的21种方法介绍
Jun 25 PHP
如何在Ubuntu下启动Apache的Rewrite功能
Jul 05 PHP
destoon利用Rewrite规则设置网站安全
Jun 21 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
PHP获取当前相对于域名目录的方法
Jun 26 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
php使用CutyCapt实现网页截图保存的方法
Oct 03 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 PHP
laravel model模型处理之修改查询或修改字段时的类型格式案例
Oct 17 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
mysql 全文搜索 技巧
2007/04/27 PHP
php pack与unpack 摸板字符字符含义
2009/10/29 PHP
Zend的MVC机制使用分析(一)
2013/05/02 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
PHP数据分析引擎计算余弦相似度算法示例
2017/08/08 PHP
php把字符串指定字符分割成数组的方法
2018/03/12 PHP
javascript定义函数的方法
2010/12/06 Javascript
初识Node.js
2014/09/03 Javascript
实例讲解JS中setTimeout()的用法
2016/01/28 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
React key值的作用和使用详解
2018/08/23 Javascript
小程序click-scroll组件设计
2019/06/18 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
Python在图片中插入大量文字并且自动换行
2019/01/02 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
Python lambda表达式filter、map、reduce函数用法解析
2019/09/11 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
Python学习笔记之装饰器
2020/08/06 Python
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
幼儿园英语教学反思
2014/01/30 职场文书
优秀党员获奖感言
2014/02/18 职场文书
局火灾防控工作方案
2014/05/25 职场文书
创先争优演讲稿
2014/09/15 职场文书
运动与健康自我评价
2015/03/09 职场文书
养成教育主题班会
2015/08/13 职场文书
再读《皇帝的新衣》的读后感悟!
2019/08/07 职场文书
实现AJAX异步调用和局部刷新的基本步骤
2022/03/17 Javascript