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 相关文章推荐
第十二节 类的自动加载 [12]
Oct 09 PHP
在JavaScript中调用php程序
Mar 09 PHP
php PDO中文乱码解决办法
Jul 20 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
Jun 22 PHP
图文介绍PHP添加Redis模块及连接
Jul 28 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
编写PHP程序检查字符串中的中文字符个数的实例分享
Mar 17 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
Jun 12 PHP
PHP/HTML混写的四种方式总结
Feb 27 PHP
PHP无限极分类函数的实现方法详解
Apr 15 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
php中的explode()函数实例介绍
Jan 18 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
PHP实现图片简单上传
2006/10/09 PHP
Php图像处理类代码分享
2012/01/19 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
2015/01/28 PHP
PHP使用ajax的post方式下载excel文件简单示例
2019/08/06 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
Js动态创建div
2008/09/25 Javascript
Javascript中获取出错代码所在文件及行数的代码
2010/09/23 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
纯Javascript实现ping功能的方法
2015/03/20 Javascript
JQuery查找DOM节点的方法
2015/06/11 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
微信小程序学习(4)-系统配置app.json详解
2017/01/12 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
JavaScript React如何修改默认端口号方法详解
2020/07/28 Javascript
python解决字典中的值是列表问题的方法
2013/03/04 Python
Python实现的rsa加密算法详解
2018/01/24 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
详解python 注释、变量、类型
2018/08/10 Python
Django中使用第三方登录的示例代码
2018/08/20 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
浅谈Html5移动端ios/Android兼容性总结
2018/06/01 HTML / CSS
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
工作说明书范文
2014/05/07 职场文书
2014年廉洁自律承诺书
2014/05/26 职场文书
课程设计感想范文
2015/08/11 职场文书
Python使用openpyxl模块处理Excel文件
2022/06/05 Python