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下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
joomla jce editor 解决上传中文名文件失败问题
Jun 09 PHP
PHP采集类Snoopy抓取图片实例
Jun 19 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
如何实现php图片等比例缩放
Jul 28 PHP
php计划任务之验证是否有多个进程调用同一个job的方法
Dec 07 PHP
php + nginx项目中的权限详解
May 23 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 PHP
PHP中常见的密码处理方式和建议总结
Oct 14 PHP
PHP实现PDO操作mysql存储过程示例
Feb 13 PHP
php统计数组不同元素的个数的实例方法
Sep 26 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
MYSQL环境变量设置方法
2007/01/15 PHP
深入php 正则表达式的学习探讨
2013/06/06 PHP
解析php中const与define的应用区别
2013/06/18 PHP
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
PHP中串行化用法示例
2016/11/16 PHP
Yii2中多表关联查询hasOne hasMany的方法
2017/02/15 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
javascript常用代码段搜集
2014/12/04 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
jquery实现弹出层效果实例
2015/05/19 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
使用React实现轮播效果组件示例代码
2016/09/05 Javascript
简单谈谈gulp-changed插件
2017/02/21 Javascript
jQuery用户头像裁剪插件cropbox.js使用详解
2017/06/07 jQuery
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
AngularJs 终极购物车(实例讲解)
2017/11/08 Javascript
Vue 实现展开折叠效果的示例代码
2018/08/27 Javascript
layui table复选框禁止某几条勾选的实例
2019/09/20 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
python解压TAR文件至指定文件夹的实例
2019/06/10 Python
pandas的to_datetime时间转换使用及学习心得
2019/08/11 Python
Python pickle模块实现对象序列化
2019/11/22 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
使用Keras画神经网络准确性图教程
2020/06/15 Python
用python给csv里的数据排序的具体代码
2020/07/17 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
Sunglasses Shop德国站:欧洲排名第一的太阳镜网站
2017/08/01 全球购物
Timberland俄罗斯官方网上商店:全球领先的户外品牌
2020/03/15 全球购物
四年级语文教学反思
2014/02/05 职场文书
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏
Python获取字典中某个key的value
2022/04/13 Python