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轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
PHP @ at 记号的作用示例介绍
Oct 10 PHP
PHP生成网站桌面快捷方式代码分享
Oct 11 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
php程序员应具有的7种能力小结
Nov 27 PHP
PIGCMS 如何关闭聊天机器人
Feb 12 PHP
php中通过DirectoryIterator删除整个目录的方法
Mar 13 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
May 09 PHP
PHP编译安装时常见错误解决办法
May 28 PHP
WordPress开发中短代码的实现及相关函数使用技巧
Jan 05 PHP
orm获取关联表里的属性值
Apr 17 PHP
PHP+MySQL实现消息队列的方法分析
May 09 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
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
php准确获取文件MIME类型的方法
2015/06/17 PHP
PHP测试成功的邮件发送案例
2015/10/26 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
javascript中字符串拼接详解
2014/09/26 Javascript
jQuery+CSS3实现树叶飘落特效
2015/02/01 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
2016/08/02 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
详解vue-cli脚手架中webpack配置方法
2018/08/22 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
layer弹出层倒计时关闭的实现方法
2019/09/27 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
微信小程序获取当前时间及星期几的实例代码
2020/09/20 Javascript
ant design vue datepicker日期选择器中文化操作
2020/10/28 Javascript
[06:33]3.19 DOTA2发布会 海涛、冷冷、2009见证希望
2014/03/21 DOTA
低版本中Python除法运算小技巧
2015/04/05 Python
python直接访问私有属性的简单方法
2016/07/25 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
2020/04/18 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
numpy.linalg.eig() 计算矩阵特征向量方式
2019/11/29 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
2020/09/17 Python
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
英国泽西岛植物:Jersey Plants Direct
2019/08/07 全球购物
大学应届生求职简历的自我评价
2013/10/08 职场文书
建党伟业电影观后感
2015/06/01 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书
Nginx配置https原理及实现过程详解
2021/03/31 Servers
python 制作一个gui界面的翻译工具
2021/05/14 Python