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与已存在的Java应用程序集成
Oct 09 PHP
Search File Contents PHP 搜索目录文本内容的代码
Feb 21 PHP
php中配置文件操作 如config.php文件的读取修改等操作
Jul 07 PHP
php警告Creating default object from empty value 问题的解决方法
Apr 02 PHP
PHP编程中的常见漏洞和代码实例
Aug 06 PHP
php通过smtp邮件验证登陆的方法
May 11 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
May 11 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
Mar 26 #PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 #PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之代理模式分析【星际争霸游戏案例】
Mar 23 #PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 #PHP
You might like
生成缩略图
2006/10/09 PHP
一个简单的网页密码登陆php代码
2012/07/17 PHP
php合并js请求的例子
2013/11/01 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
2014/11/05 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
php查看当前Session的ID实例
2015/03/16 PHP
php输出指定时间以前时间格式的方法
2015/03/21 PHP
JQuery操作Select的Options的Bug(IE8兼容性视图模式)
2013/04/21 Javascript
在jquery中combobox多选的不兼容问题总结
2013/12/24 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
基于Vue实现后台系统权限控制的示例代码
2017/08/29 Javascript
JS逻辑运算符短路操作实例分析
2018/07/09 Javascript
基于layui内置模块(element常用元素的操作)
2019/09/20 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
vue实现防抖的实例代码
2021/01/11 Vue.js
[46:55]完美世界DOTA2联赛决赛 FTD vs Phoenix 第三场 11.08
2020/11/11 DOTA
Python 用户登录验证的小例子
2013/03/06 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
详解Python中的文本处理
2015/04/11 Python
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
django 将model转换为字典的方法示例
2018/10/16 Python
python协程之动态添加任务的方法
2019/02/19 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
巴西手表购物网站:eclock
2019/03/19 全球购物
印尼购物网站:iLOTTE
2019/10/16 全球购物
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
奠基仪式主持词
2014/03/20 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
新闻稿格式范文
2015/07/18 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技
JS class语法糖的深入剖析
2022/07/07 Javascript