php设计模式之策略模式实例分析【星际争霸游戏案例】


Posted in PHP onMarch 26, 2020

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

星际开地图对战,等5秒钟进入地图后,每个玩家都会拥有一个基地,几个农民等,还会有初始的人口供给。但这些是根据种族的不同而不同。

待解决的问题:我们需要根据种族的不同,而对玩家进行不同的初始化,最好将这些不同的处理方式封装。

思路:定义初始化的接口,然后制作不同种族的初始化类。

策略模式(Strategy)示例:

为了使代码不至于过长,一部分类的定义不在此写出,如果要调试,请用字符串等方式替代new。

<?php
  //玩家的类
  class player
  {
    //所属种族
    public $race;

    //部队
    public $army;

    //建筑
    public $building;

    //人口供给
    public $supply;

    //构造函数,设定所属种族
    public function __construct($race)
    {
      $this->race = $race;
    }
  }

  //初始化的接口
  interface initialPlayer 
  {
    //制造初始化的部队
    public function giveArmy($player);

    //制造初始化的建筑
    public function giveBuilding($player);

    //初始化人口供给
    public function giveSupply($player);
  }

  //虫族的初始化算法
  class zergInitial implements initialPlayer 
  {
    //制造初始化的部队
    public function giveArmy($player)
    {
      //一个Overlord
      $player->army[] = new Overlord();

      //四个虫族农民
      for($i=0; $i<4;$i++)
      {
        $player->army[] = new Drone();
      }
    }

    //制造初始化的建筑
    public function giveBuilding($player)
    {
      //一个基地
      $player->building[] = new Hatchery();
    }

    //初始化人口供给
    public function giveSupply($player)
    {
      //虫族初始人口供给为9
      $player->supply = 9;
    }
  }

  //人族的初始化算法
  class terranInitial implements initialPlayer 
  {
    //制造初始化的部队
    public function giveArmy($player)
    {
      //四个人族农民
      for($i=0; $i<4;$i++)
      {
        $player->army[] = new SVC();
      }
    }

    //制造初始化的建筑
    public function giveBuilding($player)
    {
      //一个基地
      $player->building[] = new Hatchery();
    }

    //初始化人口供给
    public function giveSupply($player)
    {
      //人族初始人口供给为10
      $player->supply = 10;
    }
  }

  //初始化的控制类
  class initialController 
  {
    //构造函数,参数为玩家的数组
    public function __construct($playerArray)
    {
      foreach ($playerArray as $player)
      {
        switch ($player->race)
        {
          case 'zerg':
            $initialController = new zergInitial();
            break;
          case 'terran':
            $initialController = new terranInitial();
            break;
        }

        $initialController->giveArmy($player);
        $initialController->giveBuilding($player);
        $initialController->giveSupply($player);
      }
    }
  }

  //假设两个虫族,一个人族
  $playerArray = array(
    new player('zerg'), 
    new player('zerg'), 
    new player('terran'),
  );

  //进行初始化工作
  $initialController = new initialController($playerArray);
?>

用途总结:策略模式可以将不同情况下的算法封装,根据具体的情况调用。

实现总结:需要一个接口,规定算法规范,使用者(比如初始化来)只要调用对应的算法就可以了。

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

PHP 相关文章推荐
使用PHP socke 向指定页面提交数据
Jul 23 PHP
PHP写MySQL数据 实现代码
Jun 15 PHP
PHP 加密解密内部算法
Apr 22 PHP
openPNE常用方法分享
Nov 29 PHP
PHP判断是否有Get参数的方法
May 05 PHP
joomla组件开发入门教程
May 04 PHP
PHP第三方登录―QQ登录实现方法
Feb 06 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
php上传excel表格并获取数据
Apr 27 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
PHP htmlentities()函数用法讲解
Feb 25 PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 #PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 #PHP
PHP中关于php.ini参数优化详解
Feb 28 #PHP
You might like
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
js固定DIV高度,超出部分自动添加滚动条的简单方法
2013/07/10 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
JS获取时间的方法
2015/01/21 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
jQuery ajax MD5实现用户注册即时验证功能
2016/10/11 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
ionic2 tabs使用 Modal底部tab弹出框
2016/12/30 Javascript
jQuery基于ajax方式实现用户名存在性检查功能示例
2017/02/10 Javascript
js 用于检测类数组对象的函数方法
2017/05/02 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
2018/09/04 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Python实现Linux监控的方法
2019/05/16 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
Keras之自定义损失(loss)函数用法说明
2020/06/10 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
HTML5 Canvas实现放大镜效果示例
2020/03/25 HTML / CSS
澳大利亚当地最大的时装生产商:Cue
2018/08/06 全球购物
俄罗斯在线购买飞机票、火车票、巴士票网站:Tutu.ru
2020/03/16 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
大学生通用个人的自我评价
2014/02/10 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
中学生的1000字检讨书
2014/10/11 职场文书
医生辞职信范文
2015/03/02 职场文书
学习与创新自我评价
2015/03/09 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python